Reactjs 组件内的Redux unsubscribe将卸载静态调用subscribe回调

Reactjs 组件内的Redux unsubscribe将卸载静态调用subscribe回调,reactjs,redux,react-redux,Reactjs,Redux,React Redux,我正在手动将React组件连接到Redux存储。是的,我认识雷杜的丹·阿布拉莫夫。我最终会考虑react redux,但现在我想了解到底发生了什么 componentDidMount() { this.unsubscribe = store.subscribe(() => { const storeState = store.getState(); this.setState({ someData: storeState.so

我正在手动将React组件连接到Redux存储。是的,我认识雷杜的丹·阿布拉莫夫。我最终会考虑react redux,但现在我想了解到底发生了什么

componentDidMount() {
    this.unsubscribe = store.subscribe(() => {
        const storeState = store.getState();
        this.setState({
            someData: storeState.someData
        });
    }.bind(this));
}
componentWillUnmount () {
    this.unsubscribe();
}
这是我在选项卡页面组件中的一些代码。当用户更改选项卡以显示不同的数据时,这些选项卡页面在父组件中进行交换。我已通过调试器并确认,当用户更改选项卡时,会按顺序发生以下情况:

  • 卸载上一个选项卡(
    component将卸载
    激发并调用
    this.unsubscribe()
    是上一个选项卡组件,如预期的那样)
  • 新选项卡已安装。(
    componentDidMount
    激发并且
    如预期的那样,这是新的选项卡组件)
  • setState
    在subscribe回调中被调用,而
    this
    是上一个选项卡,并用错误响应投诉:
  • 警告:设置状态(…):只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用了setState()。这是禁止操作。请检查选项卡组件的代码

    这对我来说似乎很奇怪。调用
    unsubscribe
    是否应该阻止对未安装的组件调用此回调?这似乎表明,做我所做的应该让这个警告消失,只是质疑这是否是一个好主意。但就我而言,它依然存在

    我认为这无关紧要,但我使用的是ES6“class”语法,而原来的似乎并不重要

    subscribe(listener: () => void): Unsubscribe;
    
    让我们阅读订阅方法文档

  • 订阅是在每次
    dispatch()
    调用之前拍摄的。 如果在调用侦听器时订阅或取消订阅, 这不会对当前正在运行的
    dispatch()
    产生任何影响 进步。但是,下一个
    dispatch()
    调用,无论是否嵌套, 将使用订阅列表的最新快照
  • 因为您第一次调用了dispatch方法,所以所有侦听器都被调用,并且您的取消订阅调用只会在下一次dispatch调用时发生

    让我们阅读订阅方法文档

  • 订阅是在每次
    dispatch()
    调用之前拍摄的。 如果在调用侦听器时订阅或取消订阅, 这不会对当前正在运行的
    dispatch()
    产生任何影响 进步。但是,下一个
    dispatch()
    调用,无论是否嵌套, 将使用订阅列表的最新快照
  • 因为您第一次调用了dispatch方法,所以所有侦听器都被调用,并且您的取消订阅调用只会在下一次dispatch调用时发生