使用redux时,如何在反应组件中处理取消订阅?

Cla*_*kie 6 javascript reactjs redux

在我的组件中,我有以下内容:

componentWillMount: function () {
  this.unsubscribe = store.subscribe(function () {
    this.setState({message: store.getState().authentication.message});
  }.bind(this));
},

componentWillUnmount: function () {
  this.unsubscribe();
},
Run Code Online (Sandbox Code Playgroud)

不调用unsubscribe会导致以下错误:

警告:setState(...):只能更新已安装或安装的组件.这通常意味着您在已卸载的组件上调用了setState().这是一个无操作.

我想知道的是,我应该被分配unsubscribethis或者是有一个更好的地方来分配呢?

Cla*_*kie 7

正如Salehen Rahman在评论中所提到的那样,我最终使用了react-redux.

根据他们的文档,我创建了两个函数,一个用于将"全局状态"映射到组件中的props:

function mapStateToProps(state) {
  return {
    users: state.users.items
  };
}
Run Code Online (Sandbox Code Playgroud)

和一个将调度的动作映射到作为props传递给组件的函数:

function mapDispatchToProps(dispatch) {
  return {
    lockUser: (id) => dispatch(actions.lockUser(id)),
    unlockUser: (id) => dispatch(actions.unlockUser(id)),
    updateUser: (id, user) => dispatch(actions.updateUser(id, user)),
    addUser: (user) => dispatch(actions.addUser(user))
  };
}
Run Code Online (Sandbox Code Playgroud)

然后使用以下connect方法将所有内容拉到一起:

export default connect(mapStateToProps, mapDispatchToProps)(UsersContainer);
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,所有这一切都在引擎盖下将unsubscribe方法附加到组件,但它确实简化了事情.

  • 在引擎盖下它确实将"取消订阅"附加到"这个" - 但不是你的组件.React Redux`connect()`生成一个中间组件:这就是你接收数据为`this.props`而不是`this.state`的原因.您应该在大多数情况下使用React Redux而不是手动滚动它,因为它具有某些性能优化. (3认同)