在Apollo Client中退订订阅

V0i*_*iER 10 javascript apollo reactjs 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,
              ],
            },
          },
        })
      }
    },
  })
}
Run Code Online (Sandbox Code Playgroud)

问题在于,该组件在挂载时将重新订阅,即使卸载也将保留订阅。

如何退订组件?

Ped*_*nso 6

client.subscribe({ ... }).subscribe({ ... }) 将返回您的订阅实例,您可以用来取消订阅。

所以像这样:

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

componentWillUnmount () {
  // Unsibscribe subscription
  this.querySubscription.unsubscribe();
}
Run Code Online (Sandbox Code Playgroud)

通过查看react-apollo如何处理这种情况以及他们的代码库,您可以得到一些启发。

注意:我最好的建议是使用订阅组件,它将为您管理所有内容。

  • 不幸的是,订阅组件在使用 onSubscriptionData 回调时也需要一些取消订阅操作 (2认同)