您要实现的是命令式编程。react-redux 是围绕 React 的声明性特性设计的,因此可以防止您的组件直接访问 store。
一个肮脏的解决方案是从创建它的 Javascript module中导出存储,使其可以被应用程序的任何其他module访问。这样您就可以在任何地方进行订阅,而不仅仅是您的“根组件”。然而,这是一种反模式,应该避免。
解决您问题的最佳解决方案是接受 React 的声明性性质并执行以下操作:
我的组件容器.js
import {connect} from 'react-redux';
import {MyComponent} from './MyComponent';
function mapStateToProps(state) {
return {
activeUser: /* extract the active user from the state object */
};
}
export const MyComponentContainer = connect(mapStateToProps)(MyComponent)
我的组件.js
import React from 'react';
export class MyComponent extends React.Component {
componentDidMount() {
this.yourChainOfActions(this.props.activeUser);
}
componentDidUpdate(prevProps) {
if(this.props.activeUser.id !== prevProps.activeUser.id) {
this.yourChainOfActions(this.props.activeUser);
}
}
yourChainOfActions = (activeUser) => {
// ...
};
render() {
// ...
}
}
这需要一些思维转变,但这是使用 React 强制响应变化的最佳方式(直到出现钩子)
- 编辑 -
如果“yourChainOfActions”包含在一堆store.dispatch()
调用中,则您需要授予MyComponent
对该store.dispatch
函数的访问权限。通常,您不会直接传递此函数,而宁愿在MyComponentContainer
's 中创建一个包装器mapDispatchToProps
,如下所示:
我的组件容器.js
import {connect} from 'react-redux';
import {MyComponent} from './MyComponent';
function mapStateToProps(state) {
return {
activeUser: /* extract the active user from the state object */
};
}
function mapDispatchToProps(dispatch) {
return {
onActiveUserChange(activeUser) {
// use dispatch however you wish here
}
}
}
export const MyComponentContainer = connect(mapStateToProps, mapDispatchToProps)(MyComponent)
MyComponent
现在可以onActiveUserChange
通过它的 props访问该函数,你可以在它的componentDidUpdate
生命周期中使用它。
您可能决定将其拆分onActiveUserChange
为一组单独的函数以获得更好的可组合性。这取决于您和您的用例。