reactjs - 父组件重新渲染时如何强制 Apollo Query 组件重新运行查询
问题描述
我<Query>
在一个组件中使用 Apollo 客户端,当生命周期方法中的状态发生更改时,该组件会重新渲染。我希望我的<Query>
组件重新运行查询,因为我知道数据已更改。查询组件似乎正在使用需要在重新运行查询之前使其失效的缓存。
我正在使用一种不稳定的解决方法,它缓存refetch
来自父组件中渲染道具的回调,但感觉不对。如果有人感兴趣,我会在答案中发布我的方法。
我的代码看起来像这样。为了简洁起见,我从查询中删除loading
并error
处理了一些其他细节。
class ParentComponent extends React.Component {
componentDidUpdate(prevProps) {
if (this.props.refetchId !== prevProps.refetchId) {
const otherData = this.processData() // do something
this.setState({otherData}) // this forces component to reload
}
}
render() {
const { otherData } = this.state
return (
<Query query={MY_QUERY}>
{({ data }) => {
return <ChildComponent gqlData={data} stateData={otherData} />
}}
</Query>
)
}
}
如何强制<Query>
获取要传递的新数据<ChildComponent>
?
即使ParentComponent
在道具或状态更改时重新渲染,Query
也不会重新运行。ChildComponent
得到一个更新的stateData
道具,但有一个陈旧的gqlData
道具。据我了解,阿波罗的查询缓存需要失效,但我不确定。
请注意,传递refetch
给 ChildComponent 不是答案,因为它只显示来自 GraphQL 的信息并且不知道何时重新获取。我不想引入计时器或以其他方式复杂化ChildComponent
来解决这个问题 - 它不需要了解这种复杂性或数据获取问题。
解决方案
我有几乎类似的情况,我用fetchPolicy
属性解决了:
<Query fetchPolicy="no-cache"
...
任务是通过单击列表项从服务器加载一些详细信息。
如果我想添加一个动作来强制重新获取查询(例如修改详细信息),我首先将其分配refetch
给this.refetch
:
<Query fetchPolicy="no-cache" query={GET_ACCOUNT_DETAILS} variables=... }}>
{({ data: { account }, loading, refetch }) => {
this.refetch = refetch;
...
在我希望重新获取发生的特定操作中,我调用了:
this.refetch();
推荐阅读
- python-3.x - 即使添加 encoding='utf-8' 命令,Unicode 错误也不会消失
- javascript - 转换数组数组,并返回一个对象,数组中的每一对元素作为键值对
- mongodb - MongoDB查询-展开并匹配保留null或不同的值/根据条件添加新字段
- python - 为什么 reverse(string[0:]) 在 python 中显示错误,为什么我不能使用它而不是 reverse(string[1:]) + string[0]
- typescript - 打字稿泛型返回类型
- java - Spring WebClient - 如何在 HTTP 错误(4xx、5xx)的情况下访问响应正文?
- less-unix - 退出后,如何在终端上保持较少的输出?
- python - 如何从主 python 文件中正确运行单独的 python 脚本?
- python - “python setup.py test”与“pytest {package}”有什么区别?
- python - Numba 并行 prange 无法扩大 - 非常慢