Redux 学习总结
redux 是什么
- rduex是一个专门用于做状态管理的JS库(注意:不是React插件库)
- 它可以在任何框架里使用,也可以在原生JS中使用,但基本与react搭配使用
- 作用:集中式管理 多个组件共享的状态
redux原理
看图很抽象,需要用一个生活中的例子来形象表达出来,估计会理解的更深。
比如: 我饿了,去餐馆吃饭,我给服务员说我要一份蛋炒饭,然后服务员把菜单传给餐馆老板,老板通知厨师要求做一份蛋炒饭,厨师做完蛋炒饭后再交给老板,然后我自己去取餐。
现在,我就是:React Components , 服务员就是 Action Creators , 餐馆老板就是: Store, 后厨就是:Reducers 。
瞧,redux就是这样一个工作流程,是不是感觉很生活?
即:action 定义状态,dispatch派发状态,store执行,reducers执行,reducers返回一个新的状态,然后getstate更新视图
redux 三个核心概念
1. action
- 动作的对象
- 包含 俩个属性
- type: 标识属性,值为字符串,唯一,必要属性
- data: 数据属性,值类型任意,可选属性
- 例子: {type:”ADD_USER”,data:{name:”Wangpf”,age:”18”}}
2. reducer
- 用于初始化状态,加工状态。
- 加工时,根据 旧的 state 和 action ,产生新的 state 的纯函数
3. store
将 state 、 action 、 reducer 联系在一起的对象
先通过一个小案例来体现简单版的redux
redux使用步骤
创建 reducer.js
- renducer 的本质是一个函数,接收 preState,action, 返回加工后的状态
- renducer 有俩个作用: 初始化状态,加工状态
- 注意:renducer 被第一次调用时,是store自动触发的
- 传递的 preState是 undefined
- 传递的 action 是:{type:”@@REDUX/INIT_d.5.f.4”} 类似于这种形式的
- 通过dispatc(aciton),把state({type,data})放入reducer函数中加工,并返回新的state。
创建 store.js
- 引入 redux 中的
createStore
方法,创建一个store createStore
调用时要传入一个为其服务的 reducer- 即在此文件中 使用
createStore
API
- 引入 redux 中的
在组件中引入 store
- 使用 getState,dispatch,subscribe等API来实现状态更新。
小试牛刀,按照上面步骤,相应代码如下:
1 |
|
1 |
|
1 |
|
目前我们还没有用上 action 这个概念, 所以把代码优化一下:
优化步骤:
- 创建 action.js
- 用来记录用户发生的动作
- 专门用于创建action对象
- 创建 constant.js
- 使用变量控制action中的type,统一管理并防止单词出错
代码如下(我放在一起了):
1 |
|
以上就 过了一遍如何使用redux的一个简单流程。
异步 action
使用前提: 如果我们不想把 延迟的动作交给组件自身(也就是异步操作不想在组件内上实现),而想交给action来处理。
什么时候需要异步action: 想要对状态进行操作,但是具体的数据需要靠异步任务返回。
具体步骤:
- npm install redux-thunk, 并在store中配置它
1
2
3
4import { createStore,applyMiddleware } from 'redux'
// 用于支持异步action
import thunk from 'redux-thunk'
export default createStore(countReducer,applyMiddleware(thunk)) - 创建action的函数不再返回一般对象,而是一个函数,因为函数可以写异步任务。
- 异步任务有结果后,发布一个同步的action去真正操作数据
案例代码如下:
1 |
|
总结: 其实我们完全可以自己等待异步任务的结果后再去发布同步action,所以感觉这个 异步action不太重要,了解即可。
react-redux
需要明确俩个概念:
- UI组件: 不能使用任何 render 的api,只负责页面的呈现,交互等,状态完全由外部控制。
- 容器组件: 负责和redux通信,将结果交给UI组件。
需要明确俩个核心:
Provider 和 connect
Provider
Provider 的目的是让所有组件都能够访问到redux中的数据。
1 |
|
connect
首先,它的使用是这样子的:
1 |
|
mapStateToProps:
- 中文意思: 把state映射到props中。
- 映射状态,返回值是一个对象
1 |
|
mapDispatchToProps:
- 中文意思:把各种dispatch也映射到props中的供你使用
- 映射操作状态的方法,返回值是一个对象
1 |
|