javascript - 如何在 Gatsby 中循环播放 ACF 灵活内容?
问题描述
我在 Wordpress 中创建了一个具有灵活内容布局的页面,该页面当前包含两个不同的块,但是我很难理解如何在循环中正确呈现每种不同的块类型。
// test.tsx
const Test: FunctionComponent = ({ data }): ReactElement => {
const { layouts } = data.wordpressPage.edges.node.acf.layouts_page;
return (
<Layout>
<SEO title="Test" />
<main>
{layouts.map((layout, index) => {
if (WordPressAcf_two_col_image_text) {
return <TwoColImageText content={layout.content} />;
} else if (WordPressAcf_two_col_text) {
return <TwoColText content={layout.content} />;
}
})}
</main>
</Layout>
);
};
export default Test;
export const query = graphql`
query {
wordpressPage(slug: { eq: "test-flexible-content" }) {
edges {
node {
acf {
layouts_page {
... on WordPressAcf_two_col_image_text {
id
heading
content
tag
}
... on WordPressAcf_two_col_text {
id
content
heading
}
}
}
}
}
}
`;
解决方案
您可以使用该__typename
字段来获取 GraphQL 类型。这超出了内联片段,因为它是联合中所有类型之间的共享字段。
layouts_page {
__typename
... on WordPressAcf_two_col_image_text {
# …
}
... on WordPressAcf_two_col_text {
# …
}
}
然后你的条件会像这样检查身份:
layout.__typename === "WordPressAcf_two_col_image_text"
有一种比使用大的内联条件更优雅的方式来构建整个事物:
const typeMap = {
WordPressAcf_two_col_image_text: TwoColImageText,
WordPressAcf_two_col_text: TwoColText,
}
const Test: FunctionComponent = ({ data }): ReactElement => {
const layouts = data.wordpressPage.edges.node.acf.layouts_page;
return (
<Layout>
<main>
{layouts.map(({ __typename, ...layoutProps }), index) =>
React.createElement(typeMap[__typename], { key: index, ...layoutProps })
)}
</main>
</Layout>
);
};
推荐阅读
- python - 在纸浆优化解决方案中只包含独特的价值
- spring - 我正在制作一个应用程序,其中一部分是在其中添加用户制作的博客,我不能在多个页面中区分它们
- javascript - 如何创建json对象(数组)的动态列表
- sql - SQL WITH 子句和 OR 运算符
- flutter - 如何在 Flutter 中使用更新状态刷新 BottomSheet 显示?
- reactjs - 如何使用 JEST 和反应测试库测试反应组件
- python - 如何使用 PIL 压缩图像
- bootstrap-4 - 我假设由于显示弯曲而导致轮播幻灯片重叠
- git - 如何 git 显示当前分支的倒数第二个提交内容?
- typescript - Is there an expression equivalent to not assigning a property in typescript?