首先先强调一句:一定要多读官方文档,而且要精读,否则你会忽略掉很多东西!

一,Provider

刚开始看的时候,大致浏览了一下,知道了这个组件是能够接收store作为它的属性,然后它里面的子组件就可以通过props访问到store里面的所有东西了(好方便啊),然后迫不及待的写了下,发现里面的子组件的props竟然是空的(mmp),再去看一遍文档,发现,一定要用connect连接的组件才能通过props访问到store,没有用的就不能访问到了!!所以一定要看仔细了。

二,connect

connect这个函数其实最终会返回一个包着渲染组件的高阶组件。

它的基础作用如下:

1、从context里获取store

2、在componentWillMount 里通过mapStateToProps获取stateProp的值

3、在componentWillMount 里通过mapDispatchToProps获取dispatchProps的值

4、在componentWillMount 里订阅store的变化

5、将获得的stateProp,dispatchProps,还有自身的props合成一个props传给下面的组件

connect这个方法,官方的用法是:

connect([mapStateToProps], [mapDispatchToProps], [mergeProps])(MyComponent);

所以可以很明显的看出来,第一个括号里可以为空,因为都不是必选的,第二个括号里是你要连接的组件类名,所以最简单的就是

connect()(MyComponent);

这样在组件里就可以直接使用store里面的dispatch方法或者访问到store树里的state了,具体的就是this.props.dispatch()或者this.props.state()

但是这里要注意一点,connect可以不传任何参数,但是如果要使用mapDispatchToProps,就必须传mapStateToProps,否则就会报dispatch is not defined的错,如果mapStateToProps为空,可以直接传一个null

connect(null, mapDispatchToProps)(MyComponent);

接下来就是connect第一个括号里的最重要的两个参数了(mapStateToProps和mapDispatchToProps),在那之前首先弄清楚两个概念,容器组件和展示组件:

容器组件:通常是指最外层的组件,由路由直接控制的,可以使用redux,使用store,使用各种改变状态数据的方法

展示组件:通常是指拆分的小组件,它没有redux,没有store,更不会定义自己的方法,它所有的state都不会从store里面拿,而是由父组件传给他的props里拿,他的动作方法也是由props里面传的,所以它是一个比较“纯净”的组件,你传什么,他展示什么。具体的话一般都是那种复用型的组件,比如标题栏,loading组件这些。

那么什么时候才用传这两个参数,通常是展示组件connect的时候才会传这两个参数。

我们为什么要区分容器组件和展示组件?

1,分离关注,你可以更好的理解app和UI。

2,更易复用,同样的展示组件可以在不同的状态源、数据源中使用。也可以封装成容器组件,在未来重用它们。

3,展示组件是app的调色板。你可以把它们放到单独的页面,并让设计师来调整它们的样式和结构,而不用改变app的逻辑。单独的页面有静态性,你可以在上面进行screenshot regression测试。

4,这种方法会强迫你去解析布局相关的组件,比如Sidebar, Page, ContextMenu,强迫你去使用this.props.children,而非在不同容器中不断复制jsx那块地方。

三,mapStateToProps

类似于vuex里的mapState方法,具体使用直接上代码

function mapStateToProps(state) {
return {
value: state.count.value
}
}
// 此时store树里的initState结构为:
const initState = {
...
count: {
value: ""
}
...
}

那么此时我们要在当前展示组件中使用value的时候就可以通过this.props.value来访问到了,因为此时value已经绑定在了当前组件的props上面,当store里面的state变化的时候,展示组件会同步更新

四,mapDispatchToProps

类似于mapStateToProps,把当前组件所需要的动作也全部定义到props里面,因为通常动作执行的时候都需要dispatch(action),所以我们直接把动作定义好,然后组件直接用就可以了,就不用再去dispatch一个action了,mapDispatchToProps全部帮你绑好了,直接上代码

import {increaseAction} from '../actions'
function mapDispatchToProps(dispatch) {
return {
onIncreaseClick: () => dispatch(increaseAction)
}
}   

这里我们就可以直接在按钮上绑定这个方法,onClick={this.props.onIncreaseClick},如果要传参数,那就在()里面加data参数,action后面也跟一个data

要使用mapDispatchToProps必须要在connect里传递mapStateToProps,如果没有要用的,就传一个null,再说一遍!

五,bindActionCreators

这个方法是redux的,把它放在这里讲是因为它搭配mapDispatchToProps比较合适,先看一下它如何替代上面的代码:

import {increaseAction} from '../actions'
function mapDispatchToProps(dispatch) {
return {
onIncreaseClick: bindActionCreators(increaseAction, dispatch)
}
}

bindActionCreators会自动给第一个参数action执行dispatch方法,这里似乎看不出它的方便,但是试想一下,如果此时有n多个方法要定义呢,照着第一种方法,那就要写n多行的dispatch(action)了,但是如果有了bindActionCreators方法,就可以直接传一个所有actions的大对象,直接上代码:

import actions from '../actions/actionCreator'
import {bindActionCreators} from 'redux' function mapDispatchToProps(dispatch) {
return {
dispatchActions: bindActionCreators(actions, dispatch)
}
}  

这里的actions是actionCreator文件里所有的action的一个合集,那么此时要在组件中直接使用dispatch(loginAction)就可以用this.props.dispatchActions.loginAction(),有data就传data。

那什么情况下用bindActionCreators,什么时候不用只用第一种呢,我觉得看情况吧,如果当前组件的action比较多的话,可以把当前组件的所有action全部放在一个文件里,然后集体导出来,再用bindActionCreators,如果当前组件就一两个action,那我觉得没必要,直接用第一种就可以了。

redux学习日志:关于react-redux的更多相关文章

  1. React+Redux学习笔记:React+Redux简易开发步骤

    前言 React+Redux 分为两部分: UI组件:即React组件,也叫用户自定义UI组件,用于渲染DOM 容器组件:即Redux逻辑,处理数据和业务逻辑,支持所有Redux API,参考之前的文 ...

  2. React之redux学习日志(redux/react-redux/redux-saga)

    redux官方中文文档:https://www.redux.org.cn/docs/introduction/CoreConcepts.html react-redux Dome:https://co ...

  3. Redux学习(3) ----- 结合React使用

    Redux 和React 进行结合, 就是用React 做UI, 因为Redux中定义了state,并且定义了改变或获取state的方法,完全可以用来进行状态管理,React中就不用保存状态了,它只要 ...

  4. 【redux】详解react/redux的服务端渲染:页面性能与SEO

        亟待解决的疑问 为什么服务端渲染首屏渲染快?(对比客户端首屏渲染)   react客户端渲染的一大痛点就是首屏渲染速度慢问题,因为react是一个单页面应用,大多数的资源需要在首次渲染前就加载 ...

  5. redux学习日志:关于异步action

    当我们在执行某个动作的时候,会直接dispatch(action),此时state会立即更新,但是如果这个动作是个异步的呢,我们要等结果出来了才能知道要更新什么样的state(比如ajax请求),那就 ...

  6. react+redux官方实例TODO从最简单的入门(6)-- 完结

    通过实现了增-->删-->改-->查,对react结合redux的机制差不多已经了解,那么把剩下的功能一起完成吧 全选 1.声明状态,这个是全选状态 2.action约定 3.red ...

  7. 初学 react | redux

    react | redux 一.安装 React Redux 依赖 React 0.14或更新版本 npm install --sava react-redux 你需要使用 npm 作为包管理工具,配 ...

  8. React Redux学习笔记

    React Router React Router 使用教程 Redux中间件middleware [译]深入浅出Redux中间件 Redux学习之一:何为middleware? ES6 ES6新特性 ...

  9. react/redux组件库、模板、学习教程

    开源的有蚂蚁金服的: 1.https://pro.ant.design/index-cn 2.https://pro.ant.design/docs/getting-started-cn 3.http ...

随机推荐

  1. springmvc注入类 NoUniqueBeanDefinitionException: No qualifying bean of type [] is defined: expected single错误

    在springmvc中注入服务时用@Service 当有两个实现类时都标明@Service后则会出现异常: nested exception is org.springframework.beans. ...

  2. sqlalchemy 踩过的坑

    记录下Sqlalchemy遇到的问题,不定时更新. 设置主键为非自增 sqlalchemy 在sql server中默认主键是自增的,如果在数据库设置的主键不是自增的,这个时候插入就会出现异常: 提示 ...

  3. AFNetWorking 对汉字部分UTF-8编码

    随笔记一下 好用的小技巧 1.将字典数据拼接成url的参数... AFQueryStringFromParameters NSString *query = AFQueryStringFromPara ...

  4. 某xss挑战赛闯关笔记

    0x0 前言 在sec-news发现先知上师傅monika发了一个xss挑战赛的闯关wp([巨人肩膀上的矮子]XSS挑战之旅---游戏通关攻略(更新至18关)https://xianzhi.aliyu ...

  5. python并发编程之多线程

    一  同步锁 注意: 1线程抢的是GIL锁,GIL锁就是执行权限,拿到权限后才能拿到互斥锁Lock,但是如果发现Lock没有被释放而阻塞,则立即交出拿到的执行权. 2join是等待所有,即整体串行,而 ...

  6. 【ASP.NET Core】准备工作:在 Windows 10 上配置 Linux 子系统

    ASP.NET Core 其实比传统的 ASP.NET 要简单很多,而且也灵活很多,并且可以跨平台独立运行. 在 Windows 平台上,我们只要在安装 Visual Studio 的时候选择跨平台的 ...

  7. vmware 解决 authentication token manipulation error

    vmvare虚拟机长时间未使用,导致再次登录的时候密码忘了,无法登录. 启动时长按shift,进入root(recovery)模式, (recovery mode),进入"Recovery ...

  8. 从Unity中的Attribute到AOP(六)

    本文将重点对Unity剩下常用的Attribute进行讲解,其他不常用的Attribute各位可以自行去官方文档查阅. 首先是UnityEngine命名空间下的. ColorUsage,这个主要作用于 ...

  9. 【三十】php之PDO抽象层

    1.PDO介绍(php data object) PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口. PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可 ...

  10. springboot整合mybaits注解开发

    springboot整合mybaits注解开发时,返回json或者map对象时,如果一个字段的value为空,需要更改springboot的配置文件 mybatis: configuration: c ...