Provider

是什么

react-redux 提供的一个 React 组件

作用

把 store 提供给其子组件

  1. //使用 redux 的 createStore 方法创建的一个 store
  2. const store = createStore(todoApp,{})
  3. // store 作为一个 prop 传给 Provider 组件
  4. render(
  5. <Provider store={store}>
  6. <App/>
  7. </Provider>, document.getElementById('app'))

connect

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

作用

把“指定的state & 指定的action”和 React组件 连接起来 ==> 容器组件

参数说明

mapStateToProps

这是一个function,返回一个object;

(state, [ownProps]) => ({ }) // 通常省略第二个参数

作用 把指定的state作为props注入到 UI组件 中

  1. const mapStateToProps = state => {
  2. return {
  3. title: state.title,
  4. list: state.list
  5. };
  6. }

当然,不必将 state 中的数据原封不动地传入组件,可以根据 state 中的数据,动态地输出组件需要的(最小)属性。

  1. const mapStateToProps = (state) => {
  2. return {
  3. greaterThanFive: state.count > 5 // 假如只需要知道count大不大于5就成
  4. }
  5. }

函数的第二个参数 ownProps,是 React的UI组件自己的 props。有的时候,ownProps 也会对其产生影响。
比如,当你在 store 中维护了一个用户列表,而你的组件只关心一个用户。

  1. const mapStateToProps = (state, ownProps) => {
  2. // state 是 {userList: [{id: 0, name: '王二'},{id: 1, name: '李四'}]}
  3. return {
  4. user: _.find(state.userList, {id: ownProps.userId})
  5. }
  6. }
  7. class MyComp extends Component {
  8. static PropTypes = {
  9. userId: PropTypes.string.isRequired,
  10. user: PropTypes.object
  11. };
  12. render(){
  13. return <div>用户名:{this.props.user.name}</div>
  14. }
  15. }
  16. const Comp = connect(mapStateToProps)(MyComp);

mapDispatchToProps

这可以是一个function,还可以是object,

作用 把指定的action作为props注入到UI组件中

  1. // 方法
  2. const mapDispatchToProps = dispatch => {
  3. return {
  4. destroyTodo : () => dispatch({
  5. type : 'DESTROY_TODO'
  6. })
  7. }
  8. }
  9. // 对象

mergeProps

是一个函数,用来筛选哪些参数传递给组件。这个函数接受3个参数

  1. const defaultMergeProps = (stateProps, dispatchProps, ownProps ) => ({
  2. ...ownProps,
  3. ...stateProps,
  4. ...dispatchProps
  5. })

stateProps是mapStateToProps的返回值,dispatchProps是mapDispatchToProps返回值,ownProps 是当前组件自己的属性。
这个函数默认把这三个返回值拼装到一起传递给组件,可修改。

options

一个对象,有两个布尔,一个是pure,一个是withRef。

  • pure为false,只要connect接受到属性,不管是否有变化,必然刷新connect组件。
  • withRef为true时,在装饰传入的 React 组件时,Connect 会保存一个对该组件的 refs 引用,可以通过 getWrappedInstance 方法来获得该 refs,并最终获得原始的 DOM 节点。

使用

  1. const newApp = connect(store)(UI)

关于react-redux中Provider、connect的解析的更多相关文章

  1. React系列——react-redux之connect方法解析

      connect简介 前方高能预警,有耐心才能看完文章!! react-redux仅有2个API,Provider和connect,Provider提供的是一个顶层容器的作用,实现store的上下文 ...

  2. 在react/redux中使用Immutable

    在redux中使用Immutable 1.什么是Immutable? Immutable是一旦创建,就不能被更改的数据. 对Immutable对象的任何修改或添加删除操作都会返回一个新的Immutab ...

  3. let import export React入门实例教程 connect provider combineReducers 箭头函数 30分钟掌握ES6/ES2015核心内容 Rest babel

    let与var的区别 http://www.cnblogs.com/snandy/archive/2015/05/10/4485832.html es6 导入导出 http://www.csdn.ne ...

  4. Immutable.js 以及在 react+redux 项目中的实践

    来自一位美团大牛的分享,相信可以帮助到你. 原文链接:https://juejin.im/post/5948985ea0bb9f006bed7472?utm_source=tuicool&ut ...

  5. react+redux基础用法

    在学react的是,发现一旦我们封装好了我们的组件,那么我们的项目就跟搭积木一样简单快速,可是我们发现了一个问题,在一个页面往往会嵌套很多的组件,子组件必须要通过父组件传递参数才能渲染出数据,我们回想 ...

  6. react项目中的注意点

    一.ES6 的编译方法 目前主流的浏览器还不支持ES6. 现在一般采用webpack 和 <script type="text/babel">对jsx  语法进行编译, ...

  7. 使用react+redux+react-redux+react-router+axios+scss技术栈从0到1开发一个applist应用

    先看效果图 github地址 github仓库 在线访问 初始化项目 #创建项目 create-react-app applist #如果没有安装create-react-app的话,先安装 npm ...

  8. 清晰理解redux中的

    首先需要明白 Redux 的单一状态树的概念,所谓的单一状态树,就是指“所有的 state 都以一个对象树的形式储存在一个单一的 store 中.” 比如我们有这么一个状态树(或者你叫它状态对象也行) ...

  9. react+redux教程(一)connect、applyMiddleware、thunk、webpackHotMiddleware

    今天,我们通过解读官方示例代码(counter)的方式来学习react+redux. 例子 这个例子是官方的例子,计数器程序.前两个按钮是加减,第三个是如果当前数字是奇数则加一,第四个按钮是异步加一( ...

随机推荐

  1. Keepalived 配置高可用

    VRRP协议及Keepalived原理使用   VRRP 协议即 Virtual Router Redundancy Protocol,虚拟路由器冗余协议, 为了解决局域网内默认网关单点失效的问题.  ...

  2. MySQL的Root用户密码

    缘由:最近北京市二环内大兴土木,各种挖沟埋线.忽而一纸通令周末断电,故多年不断电的服务器,便令人有了关机后是否还能正常启动的隐忧.其中一台较年迈的服务器中搭载有MySQL数据库.数据库内容本属于外包项 ...

  3. (九)Pycharm异常、模块

    异常:     当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"   捕获异常:      格式:try+执行代码······ ...

  4. npm run build打包后自定义动画没有执行

    问题描述:在vue项目中,当你自己写了一些自定义动画效果,然后你npm run build打包项目放到线上环境后,发现动画并没有效果. 解决办法:在vue项目中找到build文件夹下的vue-load ...

  5. 20.2 解析与序列化【JavaScript高级程序设计第三版】

    JSON 之所以流行,拥有与JavaScript 类似的语法并不是全部原因.更重要的一个原因是,可以把JSON 数据结构解析为有用的JavaScript 对象.与XML 数据结构要解析成DOM 文档而 ...

  6. NOIP模拟 candy

    题目描述 一天,小 DD 决定买一些糖果.他决定在两家不同的商店中买糖果,来体验更多的口味. 在每家商店中都有 nn 颗糖果,每颗糖果都有一个权值:愉悦度,代表小 DD 觉得这种糖果有多好吃.其中,第 ...

  7. 10-C++远征之模板篇-学习笔记

    C++远征之模板篇 将会学到的内容: 模板函数 & 模板类 -> 标准模板类 友元函数 & 友元类 静态数据成员 & 静态成员函数 运算符重载: 一切皆有可能 友元函数 ...

  8. STL 入门 (17 暑假集训第一周)

    快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...

  9. 蓝牙技术(BlueTooth)——(一)

    一,概述 蓝牙是一种短距离的无线通信技术标准. 蓝牙协议分为4层,即核心协议层,电缆替代协议层,电话控制协议层,和      采纳的其它协议层. 这4中协议中最重要的是核心协议.蓝牙的核心协议包括基带 ...

  10. shell -- if参数用法

    一.概要1.if与[之间要有空格2.[]与判断条件之间也必须有空格3.]与:之间不能有空格 二.对字符串的判断1.if [ str1=str2 ];then fi  ----当两个字符串相同时返回真2 ...