如何在 Relay modern 中强制获取数据
How to force a fetch in Relay modern
我的顶级组件包括一个包含用户凭据的设置对话框。当在该对话框中进行更改并且对话框被关闭(状态更改为 dialogOpen=false
)时,我想强制从服务器重新获取,因为凭据可能已更改。在 Relay classic 中,顶级组件包含一个 Relay.RootContainer,所以我只是将 forceFetch=true
传递给那个 RootContainer。在 Relay modern 中,我的顶级组件包括一个 QueryRenderer。那么在这种情况下如何强制重新获取?
我发现了这个问题,https://github.com/facebook/relay/issues/1684,这似乎表明 QueryRenderer 总是 重新获取,但在我的测试中似乎并非如此。至少,当设置对话框关闭时,我没有看到我的 fetchQuery 在状态 change/refresh 之后被调用。我想我可能没有完全理解那个问题中的陈述。
谁能解释一下?
好的,我想我在这里找到了我的断开连接。在检查 QueryRenderer 的源代码时(不知道为什么我一开始不这样做),我看到如果 props.variables
发生变化,就会发生提取。所以我刚刚定义了一个名为 refetch
的布尔实例变量,并在我的对话框关闭时翻转它的值:
<QueryRenderer
environment={environment}
query={query}
variables={{refetch: this.refetch}}
由于这似乎没有很好的记录,我将在这里提到,当以下任何条件为真时,QueryRenderer 将重新获取:
- 当前
query
参数不等于前一个query
参数。
- 当前
environment
参数不等于前一个environment
参数。
- 当前
variables
参数不等于前一个variables
参数。
您可以使用传递给 QueryRenderer
的 render
的 retry
function。
<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} />
)
}} />
我的顶级组件包括一个包含用户凭据的设置对话框。当在该对话框中进行更改并且对话框被关闭(状态更改为 dialogOpen=false
)时,我想强制从服务器重新获取,因为凭据可能已更改。在 Relay classic 中,顶级组件包含一个 Relay.RootContainer,所以我只是将 forceFetch=true
传递给那个 RootContainer。在 Relay modern 中,我的顶级组件包括一个 QueryRenderer。那么在这种情况下如何强制重新获取?
我发现了这个问题,https://github.com/facebook/relay/issues/1684,这似乎表明 QueryRenderer 总是 重新获取,但在我的测试中似乎并非如此。至少,当设置对话框关闭时,我没有看到我的 fetchQuery 在状态 change/refresh 之后被调用。我想我可能没有完全理解那个问题中的陈述。
谁能解释一下?
好的,我想我在这里找到了我的断开连接。在检查 QueryRenderer 的源代码时(不知道为什么我一开始不这样做),我看到如果 props.variables
发生变化,就会发生提取。所以我刚刚定义了一个名为 refetch
的布尔实例变量,并在我的对话框关闭时翻转它的值:
<QueryRenderer
environment={environment}
query={query}
variables={{refetch: this.refetch}}
由于这似乎没有很好的记录,我将在这里提到,当以下任何条件为真时,QueryRenderer 将重新获取:
- 当前
query
参数不等于前一个query
参数。 - 当前
environment
参数不等于前一个environment
参数。 - 当前
variables
参数不等于前一个variables
参数。
您可以使用传递给 QueryRenderer
的 render
的 retry
function。
<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} />
)
}} />