如何在组件卸载时取消订阅redux store?如何装饰redux连接?

时间:2017-06-17 16:38:44

标签: javascript reactjs ecmascript-6 redux react-redux

我将以下道具(storeName)传递给我的组件:

<MyComponent reducerName="city" />

我想用动态名称(this.props.reducerName)连接到商店

例如

export default connect(state => ({
    some: state[this.props.reducerName]
}), { })(MyComponent);

如何装饰redux connect,或者我必须做什么?

我尝试跳过redux connect并使用了store.subscribe

componentDidMount() {
    store.subscribe(() => {
        this.setState({some: store.getState([this.props.reducerName]});
    });
}

但是当我移动到另一个页面时,我看到以下错误:

  

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

如何在卸载组件时取消订阅redux store?

2 个答案:

答案 0 :(得分:44)

要取消订阅,您可以通过store.subscribe简单地执行函数返回:

componentDidMount() {
  this.unsubscribe = store.subscribe(() => {
    // ...
  });
}
componentWillUnmount() {
  this.unsubscribe();
}

答案 1 :(得分:4)

connect有第二个参数ownProps,它是一个包含所有传入道具的对象。你会做这样的事情:

const mapStateToProps = (state, { reducerName = 'defaultReducer' }) => ({
  some: state[reducerName],
});

export default connect(mapStateToProps)(MyComponent);