我正在寻找有关使用Apollo,React和Meteor的最佳实践的帮助。
我将Meteor.user()模型链接到Apollo中的模式,由于有了查询组件,我现在可以访问它。我有一个查询,看起来像这样:
gql`
query User {
user {
_id,
email
}
}
`
并由解析器直接提供电子邮件地址来完成此工作。但是,我在不同的地方需要它,对于需要的每个组件,我都在 < Query >
用相同的查询制作另一个组件,然后将粘贴从文件复制到另一个。在我看来,如果我的许多组件都在一次又一次地查询相同的东西,那我就失去了一点。但是,我没有找到解决此“干”问题的方法。还没有那么多示例,包括react apollo的Query组件,因此,如果有人可以帮助我,将不胜感激。
默认情况下,Apollo客户端使用fetchPolicy
的cache-first
。这意味着,如果查询结果已经在缓存中,则将从缓存中获取查询结果,并且不会发出网络请求。这样一来,您就可以跨多个Query
组件使用相同的查询,而不必担心一遍又一遍地向服务器发出相同的请求。
fetchPolicy
如果要覆盖此默认行为,则可以为特定的Query组件指定-例如,也许要始终从服务器获取新数据,在这种情况下,您可能会使用network-only
或cache-and-network
。有关更多详细信息,请参阅文档。
注意:一个常见的“陷阱”是缓存使用id
(或_id
)字段来规范化缓存的结果。这意味着您的查询必须包含id
字段(或提供的自定义实现dataIdFromObject
)才能查看预期的行为。有关其他详细信息,请参见此页面。
就保持干燥而言,通常的做法是将查询存储在一个或多个单独的模块中,然后根据需要导入它们。因此,您可以拥有一个queries.js
像这样的文件:
import gql from 'graphql-tag'
export const USER_QUERY = gql`
query User {
user {
_id,
email
}
}
`
graphql-tag
带有一个加载程序,如果您使用的是Webpack,则可以直接从.graphql / .gql文件导入查询。在这里查看食谱。还有一个babel插件,可以有效地完成相同的操作(在此处签出)。这些方法中的任何一种都应减少代码中的冗余。
编辑:正如@ camba1的答案中指出的那样,片段也可以用来使您的查询干燥:
query User {
user {
...userFields
}
}
fragment userFields on User {
_id,
email,
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句