react-redux

一、概述

react-redux用于连接react与redux,无需再手动调用dispatch去更新页面状态。

二、使用

1、安装

npm install react-redux --save

2、程序中使用

1) Provider

使组件层级中的 connect() 方法都能够获得 Redux store。正常情况下,你的根组件应该嵌套在 中才能使用 connect() 方法。

  • store (Redux Store): 应用程序中唯一的 Redux store 对象
  • children (ReactElement) 组件层级的根组件。
ReactDOM.render(
   
    
  ,
  rootEl
)

ReactDOM.render(
  
    
      
        
        
      
    
  ,
  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 
APP组件
)

其中参数和原本书写的一样,一般第一个是函数,参数是state,函数体返回一个对象,key为传递给本组件的props属性名,value为state。第二个是一个对象,其中包含的属性为各个在本组件中需要调用的dispatch的actionCreators。一般在onClick中调用,然后调用dispatch,改变store中的state,组件接收的state也会随之改变。

你可能感兴趣的:(react-redux)