【问题标题】:How to force a fetch in Relay modern如何在 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 在状态更改/刷新后被调用。我想我可能没有完全理解那个问题中的陈述。

谁能澄清一下?

【问题讨论】:

    标签: relayjs


    【解决方案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} />
        )
      }} />
    

    【讨论】:

      猜你喜欢
      • 2018-12-06
      • 2018-01-03
      • 2018-02-14
      • 2017-10-15
      • 2022-11-02
      • 2019-09-23
      • 2018-05-17
      • 2016-09-24
      • 2018-03-09
      相关资源
      最近更新 更多