我正在尝试使用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>
有没有一种方法可以按类型组织此字段,并且只返回此特定类型的字段?
答案 0 :(得分: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,
},
})
})
}