我正在使用graphql-tag
,所以我将使用该语法。
让我们说我有这个查询:
const query = gql`
query user(id: String) {
user(id: $id) {
id
}
}
`
如果在不同的调用上重用同一查询文档节点,什么是最好的模式?除了username
外,我还希望字段email
和id
而不必重新重写整个查询喜欢:
const query = gql`
query user(id: String) {
user(id: $id) {
id
username
email
}
}
`
如果正在使事情变得更加有趣,我会在前端使用react-apollo
。
编辑:
只是为了澄清...类似这样的东西
const userIdFrag = gql`
fragment UserId on User {
id
}
`
const fullUserFrag = gql`
fragment FullUser on User {
id
username
email
}
`
const generateQuery = (documentNode) => {
return gql`
query user(id: String) {
user(id: $id) {
...documentNode
}
}
${documentNode}
`
}
const idQuery = generateQuery(userIdFrag);
const fullUserQuery = generateQuery(fullUserFrag);
(上面的方法确实有效,但是从控制台的graphql中给我错误,这使我相信这不是我应该做的事情)
答案 0 :(得分:1)
根据您的评论,以下方法应该起作用:
const generateQuery = (documentNode, fragment) => {
return gql`
query user(id: String) {
user(id: $id) {
...${fragment}
}
}
${documentNode}
`
}
const idQuery = generateQuery(userIdFrag, 'UserId');
const fullUserQuery = generateQuery(fullUserFrag, 'FullUser');
基本上,使用的片段名称是在查询的右括号后将整个documentNode对象放在末尾时需要散布的实际片段名称。
答案 1 :(得分:0)
我不是该主题的专家,但是这是我能够找到的。 (如果您在我的假设中发现任何错误,请告诉我。)
我发现this article对于动态生成gql
查询/变异有一些好处。似乎您可以通过静态方法获得一些不错的好处,尽管它的类型更多。
但是,如果您确实需要动态字段,那么我就无法使用GraphQL提供的@skip
指令找到任何不好的东西。 Here the docs ref。
对于在react-apollo
they also have it in their docs中使用它的情况。
因此,您的代码最终可能看起来像这样:
const query = gql`
query user($id: String, $skipUserMeta: Boolean!) {
user(id: $id) {
id
username @skip(if: $skipUserMeta)
email @skip(if: $skipUserMeta)
}
}
`
您只需将skipUserMeta
作为变量传递到id
字段旁边。
注意:我实际上找到了一段谈论the exact same approach here
的视频