如何强制在Relay中获取现代

bjl*_*ine 6 relayjs

我的顶级组件包括一个包含用户凭据的设置对话框.当在该对话框中进行更改并且对话框被取消(状态更改为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将在满足以下任一条件时重新获取:

  • current query参数不等于上一个query参数.
  • current environment参数不等于上一个environment参数.
  • current variables参数不等于上一个variables参数.


Kev*_*vin 5

您可以使用该retry功能则传递到QueryRendererrender

<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)