·vincent
Redux知识点
Redux应用
react状态管理
redux中间件
中间件提供第三方插件的模式,自定义拦截
action
->reducer
的过程。变为action
->middlewares
->reducer
。这种机制可以让我们改变数据流,实现如异步action
,action
过滤,日志输出,异常报告等功能
redux-logger
:提供日志输出redux-thunk
:处理异步操作redux-promise
:处理异步操作,actionCreator
的返回值是promise
redux的优缺点
- 一个组件所需要的数据,必须由父组件传过来,而不能像
flux
中直接从store
取。 - 当一个组件相关数据更新时,即使父组件不需要用到这个组件,父组件还是会重新
render
,可能会有效率影响,或者需要写复杂的shouldComponentUpdate
进行判断。
# 11、react组件的划分业务组件技术组件?
- 根据组件的职责通常把组件分为UI组件和容器组件。
- UI 组件负责 UI 的呈现,容器组件负责管理数据和逻辑。
- 两者通过
React-Redux
提供connect
方法联系起来
简述flux 思想
Flux
的最大特点,就是数据的"单向流动"。
- 用户访问
View
View
发出用户的Action
Dispatcher
收到Action
,要求Store
进行相应的更新Store
更新后,发出一个"change"
事件View
收到"change"
事件后,更新页面
Redux实现原理解析
为什么要用redux
在
React
中,数据在组件中是单向流动的,数据从一个方向父组件流向子组件(通过props
),所以,两个非父子组件之间通信就相对麻烦,redux
的出现就是为了解决state
里面的数据问题
Redux设计理念
Redux
是将整个应用状态存储到一个地方上称为store
,里面保存着一个状态树store tree
,组件可以派发(dispatch
)行为(action
)给store
,而不是直接通知其他组件,组件内部通过订阅store
中的状态state
来刷新自己的视图
Redux三大原则
- 唯一数据源
整个应用的state都被存储到一个状态树里面,并且这个状态树,只存在于唯一的store中
- 保持只读状态
state
是只读的,唯一改变state
的方法就是触发action
,action
是一个用于描述以发生时间的普通对象
- 数据改变只能通过纯函数来执行
使用纯函数来执行修改,为了描述
action
如何改变state
的,你需要编写reducers
Redux源码
js
1let createStore = (reducer) => {
2 let state;
3 //获取状态对象
4 //存放所有的监听函数
5 let listeners = [];
6 let getState = () => state;
7 //提供一个方法供外部调用派发action
8 let dispath = (action) => {
9 //调用管理员reducer得到新的state
10 state = reducer(state, action);
11 //执行所有的监听函数
12 listeners.forEach((l) => l())
13 }
14 //订阅状态变化事件,当状态改变发生之后执行监听函数
15 let subscribe = (listener) => {
16 listeners.push(listener);
17 }
18 dispath();
19 return {
20 getState,
21 dispath,
22 subscribe
23 }
24}
25let combineReducers=(renducers)=>{
26 //传入一个renducers管理组,返回的是一个renducer
27 return function(state={},action={}){
28 let newState={};
29 for(var attr in renducers){
30 newState[attr]=renducers[attr](state[attr],action)
31
32 }
33 return newState;
34 }
35}
36export {createStore,combineReducers};
Redux内部原理 内部怎么实现dispstch一个函数的
以
redux-thunk
中间件作为例子,下面就是thunkMiddleware
函数的代码
js
1// 部分转为ES5代码,运行middleware函数会返回一个新的函数,如下:
2return ({ dispatch, getState }) => {
3 // next实际就是传入的dispatch
4 return function (next) {
5 return function (action) {
6 // redux-thunk核心
7 if (typeof action === 'function') {
8 return action(dispatch, getState, extraArgument);
9 }
10 return next(action);
11 };
12 };
13}
redux-thunk
库内部源码非常的简单,允许action
是一个函数,同时支持参数传递,否则调用方法不变
redux
创建Store
:通过combineReducers
函数合并reducer
函数,返回一个新的函数combination
(这个函数负责循环遍历运行reducer
函数,返回全部state
)。将这个新函数作为参数传入createStore
函数,函数内部通过dispatch,初始化运行传入的combination
,state生成,返回store对象redux
中间件:applyMiddleware
函数中间件的主要目的就是修改dispatch
函数,返回经过中间件处理的新的dispatch
函数redux
使用:实际就是再次调用循环遍历调用reducer
函数,更新state