【问题标题】:How to notify other components of GraphQL mutation如何通知 GraphQL 突变的其他组件
【发布时间】:2018-09-21 20:20:27
【问题描述】:

假设我正在开发一个简单的待办事项应用程序,就反应组件而言,它的结构是这样的(不是实际的反应代码

<AddTodo />
<TodoList>
  <TodoItem ..>
  <TodoItem ..>
</TodoList>

TodoList 组件被包裹在 graphql(gql '..some query') HOC 中,也被包裹在 graphql(qql'..some mutation') 中以处理待办事项的查询和切换它们的 done 状态;当调用突变时,TodoList 组件知道用新数据重新呈现自己。

AddTodo 被另一个 HOC 包裹,添加了另一个突变以添加新的 todo 项。但是触发它不会重新渲染TodoList

这个小应用没有像redux那样的状态管理,我的理解是React-Apollo是为了替代redux。为什么在TodoList 中会自动发生刷新以及如何从AddTodo 传播刷新?

【问题讨论】:

    标签: reactjs graphql react-apollo


    【解决方案1】:

    有很多方法可以通知TodoList添加了新的待办事项

    1. 通过update 选项进行突变后更新您的缓存存储。示例:

      ...
      this.props.addTodo({
       variables: {
        content: text,
       },
       update: (store, { data: { addTodo } }) => {
        const data = store.readQuery({query: your_query_name})
        // do update store here ...
        store.writeQuery({query: your_query_name, data})
       }
      })
      ...
      
    2. 使用SubscriptionsubscribeToMore选项按照here的说明操作

    【讨论】:

    • 在我看来,这种方法并没有促进关注点分离,并且查询、突变和更新分散在整个代码中。与 redux 不同,最佳做法是仅使用 connect() 顶级组件。
    • 我同意你的观点,方法1与redux相同,使用cache而不是redux store。您应该使用它,以防不需要服务器的响应,例如添加新的待办事项并且只有您可以看到它。如果您添加新的待办事项并且其他人可以看到它,方法 2 可能很有用,它会通知所有 subscriber
    猜你喜欢
    • 2020-08-02
    • 2020-10-22
    • 2023-03-27
    • 2020-02-18
    • 2019-02-02
    • 2020-06-26
    • 2020-02-03
    • 2019-07-03
    • 2019-06-28
    相关资源
    最近更新 更多