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

 更新时间:2017年05月27日 09:35:19   作者:Allan简  
connect()是React-redux中的核心方法之一,它将react组件预redux中的Store真正连接在一起,下面这篇文章主要给大家介绍了react-redux中connect()方法的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

组件

React-Redux将所有组件分为两大类:展示组件(UI组件),容器组件

展示组件有以下几个特征:

  • 只负责 UI 的呈现,不带有任何业务逻辑
  • 没有状态(即不使用this.state这个变量)
  • 所有数据都由参数(this.props)提供
  • 不使用任何 Redux 的 API

容器组件有以下几个特征:

  • 负责管理数据和业务逻辑,不负责 UI 的呈现
  • 带有内部状态
  • 使用 Redux 的 API

总结为一点: 展示组件负责 UI 的呈现,容器组件负责管理数据和逻辑

connect方法解析

下图是connect()的概念图

可以简单归纳为以下几点:

  • mapStateToProps必须是function,作为输入逻辑,
  • mapDispatchToProps可以是funciton,也可以是对象,作为输出,

connect()签名

connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])

连接 React 组件与 Redux store。

连接操作不会改变原来的组件类,反而返回一个新的已与 Redux store 连接的组件类。

参数

1、 [mapStateToProps(state, [ownProps]): stateProps] (Function) : 如果定义该参数,组件将会监听 Redux store 的变化。任何时候,只要 Redux store 发生改变,mapStateToProps 函数就会被调用。该回调函数必须返回一个纯对象,这个对象会与组件的 props 合并。如果你省略了这个参数,你的组件将不会监听 Redux store。如果指定了该回调函数中的第二个参数 ownProps,则该参数的值为传递到组件的 props,而且只要组件接收到新的 props,mapStateToProps 也会被调用。

2、 [mapDispatchToProps(dispatch, [ownProps]): dispatchProps] (Object or Function) : 如果传递的是一个对象,那么每个定义在该对象的函数都将被当作 Redux action creator,而且这个对象会与 Redux store 绑定在一起,其中所定义的方法名将作为属性名,合并到组件的 props 中。如果传递的是一个函数,该函数将接收一个 dispatch 函数,然后由你来决定如何返回一个对象,这个对象通过 dispatch 函数与 action creator 以某种方式绑定在一起(提示:你也许会用到 Redux 的辅助函数 bindActionCreators() )。如果你省略这个 mapDispatchToProps 参数,默认情况下,dispatch 会注入到你的组件 props 中。如果指定了该回调函数中第二个参数 ownProps,该参数的值为传递到组件的 props,而且只要组件接收到新 props,mapDispatchToProps 也会被调用。

3、 [mergeProps(stateProps, dispatchProps, ownProps): props] (Function) : 如果指定了这个参数,mapStateToProps() 与 mapDispatchToProps() 的执行结果和组件自身的 props 将传入到这个回调函数中。该回调函数返回的对象将作为 props 传递到被包装的组件中。你也许可以用这个回调函数,根据组件的 props 来筛选部分的 state 数据,或者把 props 中的某个特定变量与 action creator 绑定在一起。如果你省略这个参数,默认情况下返回 Object.assign({}, ownProps, stateProps, dispatchProps) 的结果。

4、 [options] (Object)  如果指定这个参数,可以定制 connector 的行为。

[pure = true] (Boolean) : 如果为 true,connector 将执行 shouldComponentUpdate 并且浅对比 mergeProps 的结果,避免不必要的更新,前提是当前组件是一个“纯”组件,它不依赖于任何的输入或 state 而只依赖于 props 和 Redux store 的 state。默认值为 true。

[withRef = false] (Boolean) : 如果为 true,connector 会保存一个对被包装组件实例的引用,该引用通过 getWrappedInstance() 方法获得。默认值为 false

返回值

根据配置信息,返回一个注入了 state 和 action creator 的 React 组件。

容器组件使用 connect() 方法连接 Redux

我们用 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);

总结

connect后面第二个括号是要添加prop的react组件,第一个括号中的参数是用来改变该组件prop的方法,第一个括号有两个参数,第一个参数是一个函数,返回一个对象,对象的键是该组件的prop属性,值是该prop的值;第二个参数也是一个函数,返回一个对象,对象的键同样是prop的属性名,值是一个redux的dispatch,当这个prop属性被用于触发时,dispatch会改变redux中state的值。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • React实现核心Diff算法的示例代码

    React实现核心Diff算法的示例代码

    这篇文章主要为大家详细介绍了React如何实现Diff算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-04-04
  • React组件传children的方案总结

    React组件传children的方案总结

    自定义组件的时候往往需要传 children,由于写法比较多样,我就总结了一下,文中有详细的总结内容和代码示例,具有一定的参考价值,需要的朋友可以参考下
    2023-10-10
  • React报错Function components cannot have string refs

    React报错Function components cannot have string refs

    这篇文章主要为大家介绍了React报错Function components cannot have string refs解决方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • React Agent 自定义实现代码

    React Agent 自定义实现代码

    在使用langchain的ReactAgent遇到问题后,作者尝试自定义ReactAgent实现,通过详细分析langchain中的agent功能和问题,结合React思想,作者设计了新的agent逻辑并在GitHub上分享了代码,新的ReactAgent通过改进prompt和工具调用逻辑,提升了任务执行的效果和稳定性
    2024-10-10
  • React自定义hooks同步获取useState的最新状态值方式

    React自定义hooks同步获取useState的最新状态值方式

    这篇文章主要介绍了React自定义hooks同步获取useState的最新状态值方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • react.js CMS 删除功能的实现方法

    react.js CMS 删除功能的实现方法

    下面小编就为大家带来一篇react.js CMS 删除功能的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • React中重新实现强制实施表单的流程步骤

    React中重新实现强制实施表单的流程步骤

    这篇文章主要介绍了React中重新实现强制实施表单的流程步骤,就像设计人员一样,在添加逻辑之前,您需要为不同的状态“模拟”或创建“模拟”,例如,这里只是表单的视觉部分的模拟,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-05-05
  • React中常用的一些钩子函数总结

    React中常用的一些钩子函数总结

    这篇文章给大家总结了React中常用的一些钩子函数,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • TypeScript在React中的应用技术实例解析

    TypeScript在React中的应用技术实例解析

    这篇文章主要为大家介绍了TypeScript在React中的应用技术实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 在react中使用vue的状态管理的方法示例

    在react中使用vue的状态管理的方法示例

    这篇文章主要介绍了在react中使用vue的状态管理的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论