javascript - 在 Apollo Client 中取消订阅

标签 javascript reactjs apollo react-apollo apollo-client

在我的组件中,我有这段代码:

componentDidMount () {
  // Setup subscription listener
  const { client, match: { params: { groupId } } } = this.props
  client.subscribe({
    query: HOMEWORK_IN_GROUP_SUBSCRIPTION,
    variables: { groupId },
  }).subscribe({
    next ({ data }) {
      const cacheData = client.cache.readQuery({
        query: GET_GROUP_QUERY,
        variables: { groupId },
      })

      const homeworkAlreadyExists = cacheData.group.homeworks.find(
        homework => homework._id == data.homeworkInGroup._id
      )
      if (!homeworkAlreadyExists) {
        client.cache.writeQuery({
          query: GET_GROUP_QUERY,
          variables: { groupId },
          data: { ...cacheData,
            group: { ...cacheData.group,
              homeworks: [ ...cacheData.group.homeworks,
                data.homeworkInGroup,
              ],
            },
          },
        })
      }
    },
  })
}

问题是这个组件在挂载时会重新订阅,即使卸载也会保持订阅状态。

如何取消订阅我的组件?

最佳答案

client.subscribe({ ... }).subscribe({ ... }) 将为您的订阅返回一个实例,您可以使用该实例取消订阅。

所以像这样:

componentDidMount () {
  // Setup subscription listener
  // (...)
  this.querySubscription = client.subscribe({
    // (...)
  }).subscribe({
    // (...)
  })
}

componentWillUnmount () {
  // Unsibscribe subscription
  this.querySubscription.unsubscribe();
}

您可以通过查看 react-apollo manages this situation 的方式获得一些灵感。查看他们的代码库。

注意: 我最好的建议是使用 Subscription组件,它将为您管理一切。

关于javascript - 在 Apollo Client 中取消订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51477002/

相关文章:

reactjs - React-Native:如何将子组件包装在另一个类组件下

reactjs - 在 Apollo 客户端中使用 Auth0 的 hook useAuth0 获取 token 并设置 header

javascript - jQuery Ajax POST 不返回 PHP 变量

javascript - 如何编辑谷歌可视化数据表中的选项?

reactjs - 解耦 React 组件和 Redux Connect

graphql - graphql 模式循环引用是反模式吗?

reactjs - 如何使用 React 在状态中加入多个 Apollo 查询?

javascript - 将 Ace 编辑器与 JqueryUI 可拖动一起使用

javascript - 用于匹配\sSTUFF\r 中内容的正则表达式

node.js - 在服务器上渲染 react