React-Apollo Query 组件变量永远不会更新

Posted

技术标签:

【中文标题】React-Apollo Query 组件变量永远不会更新【英文标题】:React-Apollo Query component variables never update 【发布时间】:2019-01-12 12:51:54 【问题描述】:

我正在尝试将图表组件包装在检索图表数据的<Query> 组件中。图表组件使用QueryfetchMore 渲染道具通过更新查询的变量将新数据附加到图表。

我遇到的问题是,在使用更新的变量参数运行 fetchMore 之后,Query 组件的渲染道具似乎永远不会更新 variables 参数。

这是react-apollo 的错误,还是我错误地使用了fetchMore

这是图表的渲染函数:

render() 
  return (
    <Query
      query=gql`
        query Chart($from: Long!, $to: Long!) 
          chartData(from: $from, to: $to) @connection(key: "chartData") 
            ...
          
        
      `
      variables= from: this.props.from, to: this.props.to 
    >
      ( data:  chartData  = , variables:  from, to , fetchMore ) => 

        const fetchNext = () =>
          fetchMore(
            variables:  from: from + 30, to: to + 30, ,
            updateQuery: (previousResult,  fetchMoreResult ) => 
              const updatedResult = Object.assign(, fetchMoreResult)
              updatedResult.chartData = [
                ...previousResult.chartData,
                ...fetchMoreResult.chartData,
              ]
              return updatedResult
            ,
          )

        return (
          <Chart
            chartData=chartData
            from=from
            to=to
            fetchNext=fetchNext
          />
        )
      
    </Query>
  ) 

这是我正在经历的步骤:

    render prop 使用 from = 0to = 29chartData 作为 30 个数据点的数组运行 触发 fetchMore。使用from = 30to = 59 再次运行查询。响应返回 30 个新数据点。 updatedResult 是完整的 60 个数据点。 渲染道具再次运行。 chartData 是一个包含 60 个数据点的数组,正如预期的那样,但 from = 0to = 29 仍然如此。我希望它们分别更新到3059。这会导致图表的 xMin 和 xMax 错误,因为变量没有更新。

作为一种解决方法,我尝试在updateQuery 回调中设置fromto 的组件状态副本,但这会导致fromto 的值与chartData 不同步直到 Apollo 完成对其商店的更新。

非常感谢任何帮助。谢谢!

【问题讨论】:

【参考方案1】:

从某种程度的复杂性来看,渲染 fn 不适合......除了视图之外的任何东西。

看看https://github.com/sysgears/apollo-universal-starter-kit/blob/master/packages/client/src/modules/post/containers/Post.jsx - 关注点(查询/容器/组件)的分离很好,示例涵盖了 fetchMore。

【讨论】:

我使用渲染道具方法作为@dkulkarni,还遇到了组件变量不更新的问题。在我重写为 hoc 模式后,它起作用了。但是,我认为首选的方法是使用渲染道具方法? Apollo 网站的示例都是使用渲染 props 的方式 它们在开始时更简单,并且适用于(也许)一半的用例,但您很快就会陷入渲染查询/变异组件的地狱。你能想象一个带有 fetchMore 的组件和查询以及使用查询/突变组件完成的三到四个可能的突变吗?添加一个本地状态和一些事件处理程序,一些条件渲染和 redux ... :D 组件应该很简单,否则应该重构。 我同意你的看法。它可能会变成一团乱七八糟的代码。我个人更喜欢 HOC 模式。 ... 你可以使用所有 react 的组件生命周期方法。点赞?回答或删除您自己的问题? 我相信 react hooks 和 suspense 会在未来结合渲染 props 的方式在功能组件中提供生命周期方法。我还没有玩过,所以不确定这是否会产生更清晰的代码

以上是关于React-Apollo Query 组件变量永远不会更新的主要内容,如果未能解决你的问题,请参考以下文章

如何在 react-apollo graphql 查询中正确使用动态变量?

从 react-apollo 模拟 <Query />

React-Apollo - 查询 - renderProp:反应警告:无法对未安装的组件执行反应状态更新

Graphql,react-apollo如何在加载组件状态时将变量传递给查询

使用带有 react-apollo 查询的变量

React-Apollo:带变量的查询导致 UI 不再乐观