一、概述
react-redux用于连接react与redux,无需再手动调用dispatch
去更新页面状态。
二、使用
1、安装
npm install react-redux --save
2、程序中使用
1) Provider
使组件层级中的 connect()
方法都能够获得 Redux store。正常情况下,你的根组件应该嵌套在 <Provider>
中才能使用 connect()
方法。
-
store
(Redux Store): 应用程序中唯一的 Redux store 对象 -
children
(ReactElement) 组件层级的根组件。
ReactDOM.render(
<Provider store={store}>
<MyRootComponent />
</Provider>,
rootEl
)
ReactDOM.render(
<Provider store={store}>
<Router history={history}>
<Route path="/" component={App}>
<Route path="foo" component={Foo} />
<Route path="bar" component={Bar} />
</Route>
</Router>
</Provider>,
document.getElementById('root')
)
2) connect()
connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])
App = connect(([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])(App)
连接 React 组件与 Redux store。连接操作不会改变原来的组件类。反而返回一个新的已与 Redux store 连接的组件类。
- [
mapStateToProps(state, [ownProps]): stateProps
]
这个参数是一个函数,必须返回一个纯对象,这个对象会与组件的 props 合并。如果定义该参数,组件将会监听 Redux store 的变化。任何时候,只要 Redux store 发生改变,mapStateToProps
函数就会被调用。如果省略了这个参数,组件将不会监听 Redux store。如果指定了该回调函数中的第二个参数 ownProps,则该参数的值为传递到组件的 props,而且只要组件接收到新的 props,mapStateToProps 也会被调用。
(然后通过this.props.对象key
来获取store中的state) - [
mapDispatchToProps(dispatch, [ownProps]): dispatchProps
]
这个参数是一个对象或者函数, 如果传递的是一个对象,那么每个定义在该对象的函数都将被当作 Redux action creator,对象所定义的方法名将作为属性名;每个方法将返回一个新的函数,函数中dispatch
方法会将 action creator 的返回值作为参数执行。这些属性会被合并到组件的 props 中。
如果传递的是一个函数,该函数将接收一个dispatch
函数,然后由你来决定如何返回一个对象,这个对象通过dispatch
函数与 action creator 以某种方式绑定在一起(提示:你也许会用到 Redux 的辅助函数bindActionCreators()
。如果你省略这个mapDispatchToProps
参数,默认情况下,dispatch
会注入到你的组件 props 中。如果指定了该回调函数中第二个参数ownProps
,该参数的值为传递到组件的 props,而且只要组件接收到新 props,mapDispatchToProps
也会被调用。
(然后可以通过调用this.props.这个对象的属性值
来调用dispatch
) - [
mergeProps(stateProps, dispatchProps, ownProps): props
]
是一个函数, 如果指定了这个参数,mapStateToProps() 与 mapDispatchToProps() 的执行结果和组件自身的 props 将传入到这个回调函数中。该回调函数返回的对象将作为 props 传递到被包装的组件中。你也许可以用这个回调函数,根据组件的 props 来筛选部分的 state 数据,或者把 props 中的某个特定变量与 action creator 绑定在一起。如果你省略这个参数,默认情况下返回 Object.assign({}, ownProps, stateProps, dispatchProps) 的结果。 - [
options
]
是一个对象,如果指定这个参数,可以定制 connector 的行为。
[pure = true
] (Boolean): 如果为 true,connector 将执行 shouldComponentUpdate 并且浅对比 mergeProps 的结果,避免不必要的更新,前提是当前组件是一个“纯”组件,它不依赖于任何的输入或 state 而只依赖于 props 和 Redux store 的 state。默认值为 true。
[withRef = false
] (Boolean): 如果为 true,connector 会保存一个对被被包含的组件实例的引用,该引用通过 getWrappedInstance() 方法获得。默认值为 false。
三、 装饰器写connect
使用 babel-plugin-transform-decorators-legacy
babel插件支持装饰器语法
npm install babel-plugin-transform-decorators-legacy
安装后,进入package.json
进行配置(首先要安装eject 详情:eject修改webpack配置文档)
// plugins配置项新增如下配置
[
"@babel/plugin-proposal-decorators",
{
"legacy": true
}
]
完成配置后,不再需要将需要使用connect函数的组件作为参数传入,改为如下书写方式
@connect(参数)
class App extends React.Component(
render(){
renturn <div>APP组件</div>
)
其中参数和原本书写的一样,一般第一个是函数,参数是state,函数体返回一个对象,key为传递给本组件的props属性名,value为state。第二个是一个对象,其中包含的属性为各个在本组件中需要调用的dispatch的actionCreators
。一般在onClick中调用,然后调用dispatch,改变store中的state,组件接收的state也会随之改变。