02.redux概念
图书馆模型:
- React Components:借书的用户
- Action Creators:借书说的话(借哪本书)
- Store:图书管理员
- Reducers(减速器,还原剂 ):记录本
03.使用AntDesign
示例:./03.AntDesign-TodoList
https://ant.design/docs/react/introduce-cn
04.Redux的创建与使用
文件结构
1 | src |
安装Redux
yarn add redux
创建Reducer和Store
在这一步中我们创建一个Reducer去生成一个存放数据的位置,再把Reducer交给Store。
1 | // .store/index.js |
1 | // ./store/reducer.js |
在组件中使用Redux中保存的数据
- 在组件中导入store文件的位置
1
import store from '../04.Redux/store.js';
- 在组件中可以使用
store.getState()
获取数据1
2
3
4
5// 将store中的数据绑定在state上
constructor(props){
super(props);
this.state = store.getState()
}
05.Action和Reducer的编写
使用Redux DevTools
在创建store的文件下,添加一句代码
1 | const store = createStore( |
组件中直接请求更改数据
1.组件发送修改请求action
在组件中可以直接创建一个action
来请求更改Store中的数据,但是这个action
必须符合规范,之后组件可以通过调用store.dispatch(action)
方法,把action
传递给Store
拿TodoList项目来说,当用户在文本框内输入了文字,会触发onChange
而调用handleInputChange
方法,此时在方法中要向Store中发送一个修改请求,如下:
1 | handleInputChange(e) { |
2.Store转发请求给Reducer
Store接受到一个action
后,会将 当前的数据(previousState) 和 操作指令(action) 转发给Reducer(这就是在reducer.js
中,要接收的两个变量),这一步是自动执行的。
3.Reducers处理数据
Reducers接收到当前的数据(previousState)和操作的指令(action)后,会将它们对并且处理数据,之后将新的数据(newState)传回给Store。
如在TodoList示例中,在Reducers中设置一个change_input_value
的判断方法,去设置数据的方法:
1 | // ./store/reducer.js |
在此要注意的是:reducer可以接收state,但是绝对不能修改state,必须对state进行深拷贝后再处理数据。
4.Store拿到Reducer的处理结果
Store拿到Reducer的处理结果后,会将旧的数据替换为新的数据,这个阶段Store并未将数据交给组件,需要组件去自我感知数据发生了变化并自行更新界面。
5.组件感知Store中数据变化
在组件中的constror
中调用store.subscribe()
设置一个事件订阅,它的参数为个方法函数,用来检查store中的数据(state)是否发生了变化,如果发生了变化,就会调用参数中传入的方法,从而更新组件state中的数据,如下:
1 | constructor() { |
06.ActionType的拆分
在./store
目录下创建actionTypes来存放action的命名
1 | // actionTypes.js |
之后将actionTypes.js
中的变量分别导入TodoList.js
和ruducer.js
中,之后在定义action
时,调用变量即可
1 | // reducer.js |
07.使用ActionCreator统一创建action
我们按照 组件中直接请求更改数据 的方法直接在业务逻辑中创建action会导致代码变得混乱,为了统一,我们将创建action的方法写入./store/actionCreator
文件下,结合actionTypes
统一创建action,然后再在业务逻辑中调用。
1 | // actionCreator.js |
1 | // Todolist.js |
09. 知识点补充
总流程
- 在
actionTypes.js
中创建变量存放action的操作类型,并向外暴露出变量名,提供给actionCreator.js
和reducer.js
调用。 - 在
actionCreator.js
中集中编写生成action对象,设置action对象的类型以及传入的数据名称,向外暴露该对象,供组件在业务逻辑代码部分调取使用。 - 在
reducer.js
判断某个action的type,编写与之对应的数据操作,并返回给store。 - 在组件业务逻辑代码中调用
actionCreator.js
提供的方法,生成一个action,并利用store.dispatch()
向store发送一个action。
1 | 文件依赖关系: |
注意事项
- store是唯一的
- 只有store才能变更自己的内容
- Reducer必须是纯函数:纯函数指的是,给定固定的输入,就一定会有固定的输出,而且不会有任何副作用
核心API
createStore
: 创建store
store.dispatch
: 派发action
store.getState
: 获取store中的数据内容
store.subscribe
: 订阅stote中的改变