【问题标题】:How can I loop through ACF flexible content in Gatsby?如何在 Gatsby 中循环播放 ACF 灵活内容?
【发布时间】:2020-10-14 05:52:35
【问题描述】:

我在 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
                }
              }
            }
          }
        }
      }
`;

【问题讨论】:

    标签: javascript reactjs graphql gatsby


    【解决方案1】:

    您可以使用__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>
      );
    };
    

    【讨论】:

      猜你喜欢
      • 2020-07-10
      • 2018-05-31
      • 1970-01-01
      • 2023-03-29
      • 2018-09-07
      • 2017-01-07
      • 2019-08-08
      • 2016-04-07
      • 2013-12-29
      相关资源
      最近更新 更多