源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

react-redux中connect()方法详细解析

  • 时间:2022-01-15 18:30 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:react-redux中connect()方法详细解析
[b]组件[/b] React-Redux将所有组件分为两大类:展示组件(UI组件),容器组件 [b]展示组件有以下几个特征:[/b] [list] [*]只负责 UI 的呈现,不带有任何业务逻辑[/*] [*]没有状态(即不使用[code]this.state[/code]这个变量)[/*] [*]所有数据都由参数([code]this.props[/code])提供[/*] [*]不使用任何 Redux 的 API [/*] [/list] [b]容器组件有以下几个特征:[/b] [list] [*]负责管理数据和业务逻辑,不负责 UI 的呈现[/*] [*]带有内部状态[/*] [*]使用 Redux 的 API[/*] [/list] 总结为一点: 展示组件负责 UI 的呈现,容器组件负责管理数据和逻辑 [b]connect方法解析[/b] 下图是connect()的概念图 [img]http://files.jb51.net/file_images/article/201705/201752792852658.jpg?20174279294[/img] [b]可以简单归纳为以下几点:[/b] [list] [*]mapStateToProps必须是function,作为输入逻辑,[/*] [*]mapDispatchToProps可以是funciton,也可以是对象,作为输出, [/*] [/list] [b]connect()签名[/b] [code]connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])[/code] 连接 React 组件与 Redux store。 连接操作不会改变原来的组件类,反而返回一个新的已与 Redux store 连接的组件类。 [b]参数[/b] 1、[code] [mapStateToProps(state, [ownProps]): stateProps] (Function)[/code] : 如果定义该参数,组件将会监听 Redux store 的变化。任何时候,只要 Redux store 发生改变,mapStateToProps 函数就会被调用。该回调函数必须返回一个纯对象,这个对象会与组件的 props 合并。如果你省略了这个参数,你的组件将不会监听 Redux store。如果指定了该回调函数中的第二个参数 ownProps,则该参数的值为传递到组件的 props,而且只要组件接收到新的 props,mapStateToProps 也会被调用。 2、 [code][mapDispatchToProps(dispatch, [ownProps]): dispatchProps] (Object or Function) [/code]: 如果传递的是一个对象,那么每个定义在该对象的函数都将被当作 Redux action creator,而且这个对象会与 Redux store 绑定在一起,其中所定义的方法名将作为属性名,合并到组件的 props 中。如果传递的是一个函数,该函数将接收一个 dispatch 函数,然后由你来决定如何返回一个对象,这个对象通过 dispatch 函数与 action creator 以某种方式绑定在一起(提示:你也许会用到 Redux 的辅助函数 [code]bindActionCreators() [/code])。如果你省略这个 mapDispatchToProps 参数,默认情况下,dispatch 会注入到你的组件 props 中。如果指定了该回调函数中第二个参数 ownProps,该参数的值为传递到组件的 props,而且只要组件接收到新 props,mapDispatchToProps 也会被调用。 3、[code] [mergeProps(stateProps, dispatchProps, ownProps): props] (Function)[/code] : 如果指定了这个参数,mapStateToProps() 与 mapDispatchToProps() 的执行结果和组件自身的 props 将传入到这个回调函数中。该回调函数返回的对象将作为 props 传递到被包装的组件中。你也许可以用这个回调函数,根据组件的 props 来筛选部分的 state 数据,或者把 props 中的某个特定变量与 action creator 绑定在一起。如果你省略这个参数,默认情况下返回 [code]Object.assign({}, ownProps, stateProps, dispatchProps)[/code] 的结果。 4、[code] [options] (Object) [/code] 如果指定这个参数,可以定制 connector 的行为。 [code][pure = true] (Boolean)[/code] : 如果为 true,connector 将执行 shouldComponentUpdate 并且浅对比 mergeProps 的结果,避免不必要的更新,前提是当前组件是一个“纯”组件,它不依赖于任何的输入或 state 而只依赖于 props 和 Redux store 的 state。默认值为 true。 [code][withRef = false] (Boolean)[/code] : 如果为 true,connector 会保存一个对被包装组件实例的引用,该引用通过 [code]getWrappedInstance()[/code] 方法获得。默认值为 false [b]返回值[/b] 根据配置信息,返回一个注入了 state 和 action creator 的 React 组件。 [b]容器组件使用 connect() 方法连接 Redux[/b] 我们用 react-redux 提供的 connect() 方法将“笨拙”的 Counter 转化成容器组件。connect() 允许你从 Redux store 中指定准确的 state 到你想要获取的组件中。这让你能获取到任何级别颗粒度的数据。 让我们看下,我们拥有一个 的展示组件,它有一个通过 props 传过来的值,和一个函数 onIncrement,当你点击 “Increment” 按钮时就会调用这个函数:
import { Component } from 'react';

export default class Counter extends Component {
 render() {
 return (
  <button onClick={this.props.onIncrement}>
  {this.props.value}
  </button>
 );
 }
}
containers/CounterContainer.js
import { Component } from 'react';
import { connect } from 'react-redux';

import Counter from '../components/Counter';
import { increment } from '../actionsCreators';

// 哪些 Redux 全局的 state 是我们组件想要通过 props 获取的?
function mapStateToProps(state) {
 return {
 value: state.counter
 };
}

// 哪些 action 创建函数是我们想要通过 props 获取的?
function mapDispatchToProps(dispatch) {
 return {
 onIncrement: () => dispatch(increment())
 };
}

export default connect(
 mapStateToProps,
 mapDispatchToProps
)(Counter);
[b]总结[/b] connect后面第二个括号是要添加prop的react组件,第一个括号中的参数是用来改变该组件prop的方法,第一个括号有两个参数,第一个参数是一个函数,返回一个对象,对象的键是该组件的prop属性,值是该prop的值;第二个参数也是一个函数,返回一个对象,对象的键同样是prop的属性名,值是一个redux的dispatch,当这个prop属性被用于触发时,dispatch会改变redux中state的值。 好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程素材网的支持。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部