【问题标题】:Query an array with unstructured objects on GraphQL在 GraphQL 上查询具有非结构化对象的数组
【发布时间】:2020-03-01 22:28:48
【问题描述】:

我正在尝试使用 GraphQL 在 Gridsome 中查询包含对象的非结构化数组。目前看起来很乱,感觉应该有更好的方法来做到这一点。

从 CMS 加载到 GraphQL 的数据如下所示:

{
    title: "Homepage",
    top_image: "imgurl.jpg",
    page_builder: [
             {
                 type: "slider",
                 field: "data example",
                 different_field: "data example"
             },
              {
                 type: "call_to_action",
                 field_for_cta: "data example",
                 different_cta_field: "data example"
             }
    ]
}

如您所见,page_builder 中的对象将具有不同的字段,具体取决于客户端如何构建此部分。

当我尝试在 GraphQL 中查询时。会变得很乱:

<page-query>
query {
  data: pages(path: "/pages") {
    title,
    top_image,
    page_builder {
      type,
      field,
      different_field,
      type,
      field_for_cta,
      different_cta_field

      #this list will have way more fields depending on all the page builder elements

    }
    }
  }
</page-query>

有没有办法按类型组织这些字段并只返回这种特定类型的字段?

【问题讨论】:

    标签: graphql gridsome


    【解决方案1】:

    假设 gridsome 支持片段,你可以这样做:

    <page-query>
    query {
      data: pages(path: "/pages") {
        title,
        top_image,
        page_builder {
          ...A @include(if: $includeA)
          ...B @include(if: $includeB)
          ...C @include(if: $includeC)
        }
      }
    }
    
    # Note: Replace PageBuilderType with appropriate type
    fragment A on PageBuilderType {
      # your fields here
    }
    fragment B on PageBuilderType {
      # your fields here
    }
    fragment C on PageBuilderType {
      # your fields here
    }
    </page-query>
    

    然后您可以在调用createPage 时定义变量,如图here

    api.createPages(({ createPage }) => {
        createPage({
          path: '/my-page',
          component: './src/templates/MyPage.vue',
          queryVariables: {
            includeA: someCondition,
            includeB: someCondition,
            includeC: someCondition,
          },
        })
      })
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-14
      • 2016-10-24
      • 2018-11-12
      • 2020-02-16
      • 2020-03-09
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多