如何在 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参数。

您可以使用传递给 QueryRendererrenderretry 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} />
    )
  }} />