我的顶级组件包括一个包含用户凭据的设置对话框.当在该对话框中进行更改并且对话框被取消(状态更改为dialogOpen=false)时,我想强制从服务器进行新的提取,因为凭据可能已更改.在Relay classic中,顶级组件包含一个Relay.RootContainer,所以我只是传递forceFetch=true给了RootContainer.在Relay modern中,我的顶级组件包括QueryRenderer.那么在这种情况下如何强制重新获取呢?
我发现了这个问题,https://github.com/facebook/relay/issues/1684,这似乎表明QueryRenderer 总是重新获取,但在我的测试中似乎并非如此.至少,当关闭设置对话框时,我没有看到在状态更改/刷新后调用fetchQuery.我想我可能不完全理解那个问题中的陈述.
任何人都可以澄清吗?
bjl*_*ine 11
好的,我想我在这里想出了我的脱节.在检查QueryRenderer的源代码时(不知道我为什么不首先这样做),我看到如果props.variables更改将发生提取.所以我刚刚定义了一个调用的布尔实例变量,refetch并在我的对话框被解除时翻转它的值:
<QueryRenderer
environment={environment}
query={query}
variables={{refetch: this.refetch}}
Run Code Online (Sandbox Code Playgroud)
由于这似乎没有很好地记录,我在这里将提到QueryRenderer将在满足以下任一条件时重新获取:
query参数不等于上一个query参数.environment参数不等于上一个environment参数.variables参数不等于上一个variables参数.您可以使用该retry功能则传递到QueryRenderer的render。
<QueryRenderer
environment={environment}
query={graphql`
query MyQuery($exampleUserId: String!) {
user(userId: $exampleUserId) {
favoriteIceCream
}
}
`}
render={({ error, props, retry }) => {
// Here, you could call `retry()` to refetch data
// or pass it as a prop to a child component.
return (
<IceCreamSelectionView refetchData={retry} user={props.user} />
)
}} />
Run Code Online (Sandbox Code Playgroud)