如何在 Relay Modern 中强制获取

Posted

技术标签:

【中文标题】如何在 Relay Modern 中强制获取【英文标题】:How to force a fetch in Relay modern 【发布时间】:2017-11-27 04:08:16 【问题描述】:

我的***组件包括一个包含用户凭据的设置对话框。当在该对话框中进行更改并关闭对话框(状态更改为dialogOpen=false)时,我想强制从服务器获取新的数据,因为凭据可能已更改。在 Relay 经典中,***组件包含一个 Relay.RootContainer,所以我只是将 forceFetch=true 传递给该 RootContainer。在现代 Relay 中,我的***组件包括一个 QueryRenderer。那么在这种情况下如何强制重新获取呢?

我发现了这个问题,https://github.com/facebook/relay/issues/1684,这似乎表明 QueryRenderer总是 重新获取,但在我的测试中似乎并非如此。至少,当设置对话框关闭时,我没有看到我的 fetchQuery 在状态更改/刷新后被调用。我想我可能没有完全理解那个问题中的陈述。

谁能澄清一下?

【问题讨论】:

【参考方案1】:

好的,我想我在这里找到了我的断开连接。在检查 QueryRenderer 的源时(不知道为什么我一开始不这样做),我看到如果props.variables 发生变化,就会发生提取。所以我刚刚定义了一个名为refetch 的布尔实例变量,并在我的对话框被关闭时翻转它的值:

<QueryRenderer
  environment=environment
  query=query
  variables=refetch: this.refetch

由于这似乎没有很好的记录,我将在此处提及 QueryRenderer 将在以下任何条件为真时重新获取:

当前的query 参数不等于之前的query 参数。 当前的environment 参数不等于之前的environment 参数。 当前variables 参数不等于之前的variables 参数。

【讨论】:

这很好,但是您知道如何强制获取,即不使用缓存吗? @plamenh 相信你加了密钥fetchPolicy="network-only" 只是想为可能面临相同问题的任何人分享一些经验:仅在需要时更改变量(即不要更改变量以刷新数据,但如果需要更改它们更改检索到的数据 - 例如,延迟加载);如果您只想刷新数据(即当您不使用订阅来获取新数据或者您有混合的 graphql/rest 环境时),请使用 Refetch Container(请参阅中继文档,那里有很好的解释)。【参考方案2】:

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

【讨论】:

以上是关于如何在 Relay Modern 中强制获取的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Relay Modern 的父组件中最好地访问来自 QueryRenderer 的数据?

refetch Container 在 Relay Modern 的 refetch Options 中无论是不是强制都给出相同的结果

如何在 Relay Modern 中取消订阅

如何在 TypeScript 中使用 Relay Modern(babel-plugin-relay 和 relay-compiler)?

如何使用 Relay Modern 突变进行文件上传?

在 Relay Modern 中处理身份验证