doubleyong
管理员
管理员
  • 最后登录2026-05-25
  • 发帖数1198
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
阅读:5971回复:0

[react]Flux与Redux

楼主#
更多 发布于:2019-04-14 14:37
一. Flux

1. 概念

flux是一套前端应用架构模式,核心是单向数据流
注:flux不是具体的代码实现

2. 解决了什么问题

组件内部state过于复杂时会使得组件本身臃肿难以维护,因此需要将state与事件部分抽取出来,组件本身只负责获取数据与渲染,其他的逻辑通过分类从component中剥离出去,这样可以保证数据流更清晰。

3. 分类分离的内容

组件中只负责渲染之后,组件状态与行为如何分类呢
  • store:保存状态与行为,通过对store的监听可以实现store中数据变化时实时渲染组件。
  • action:保存行为描述与行为所需数据,本事就是一个js对象,如下所示
     { type:'delete',id:'1' }
  • dispatcher
     有了store中的行为和数据,有了action的行为描述,组件如何触发行为从而改变state呢?这就需要dispatcher做中转,它的存在保证了单向MVC的实现。
     dispatcher提供两种方法,register与dispatch
     register接收回调函数作为参数,函数内使用switch...case方式先设定好特定actiontype对应的store中的行为函数(也可能会加一些额外逻辑)
     dispatch接收参数为action,当接收以后action会传递给register的回调函数,在函数内部处理action中的数据。
4. Flux的理解

Flux 是一种应用架构,或者说是一种思想,它跟 React 本身没什么关系,它可以用在 React 上,也可以用在别的框架上。前面说到 Flux 在 React 中主要用来统一管理引起 state 变化的情况。Flux 维护着一个或者多个叫做Store的变量,就像 MVC 里面的 Model,里面存放着应用用到的所有数据,当一个事件触发时 ,Flux 对事件进行处理,对 Store 进行更新,当 Store 发生变化时,通常是由应用的根组件(也叫 controller view)去获取最新的 store,然后更新 state,之后利用 React 单向数据流的特点一层层将新的 state 向下传递实现 view 的更新。这里的 controller view 可以有多个也可以不是根组件,但是这样数据流维护起来就比较麻烦。

Flux 的思维模型如下:

图片:flux.PNG




Flux 主要包括四个部分,Dispatcher、Store、View、Action,其中 Dispatcher 是 Flux 的核心枢纽,它相当于是一个事件分发器,将那些分散在各个组件里面的逻辑代码收集起来,统一在 Dispatcher 中进行处理。


完整的 Flux 处理流程是这样的:用户通过与 view 交互或者外部产生一个 Action,Dispatcher 接收到 Action 并执行那些已经注册的回调,向所有 Store 分发 Action。通过注册的回调,Store 响应那些与他们所保存的状态有关的 Action。


然后 Store 会触发一个 change 事件,来提醒 controller-views 数据已经发生了改变。Controller-views 监听这些事件并重新从 Store 中获取数据。这些 controller-views 调用他们自己的 setState() 方法,重新渲染自身以及组件树上的所有后代组件。


使用 Flux 有个好处就是我只需要用 action 对象向 Dispatcher 描述当前的事件就可以执行对应的逻辑,因为 Dispatcher 是所有 Action 的处理中心,即使没有对应的事件发生,我们也可以“伪造”一个出来,非常利于测试。

二. Redux

Redux 的作用跟 Flux 是一样的,它可以看作是 Flux 的一种实现,但是又有点不同,具体的不同总结起来就是:
1. Redux 只有一个 store
Flux 里面会有多个 store 存储应用数据,并在 store 里面执行更新逻辑,当 store 变化的时候再通知 controller-view 更新自己的数据,Redux 将各个 store 整合成一个完整的 store,并且可以根据这个 store 推导出应用完整的 state。同时 Redux 中更新的逻辑也不在 store 中执行而是放在 reducer 中。


2. 没有 Dispatcher
Redux 中没有 Dispatcher 的概念,它使用 reducer 来进行事件的处理,reducer 是一个纯函数,这个函数被表述为(previousState, action) => newState,它根据应用的状态和当前的 action 推导出新的 state。Redux 中有多个 reducer,每个 reducer 负责维护应用整体 state 树中的某一部分,多个 reducer 可以通过combineReducers方法合成一个根reducer,这个根reducer负责维护完整的 state,当一个 action 被发出,store 会调用 dispatch 方法向某个特定的 reducer 传递该 action,reducer 收到 action 之后执行对应的更新逻辑然后返回一个新的 state,state 的更新最终会传递到根reducer处,返回一个全新的完整的 state,然后传递给 view。


在我看来,Redux 和 Flux 之间最大的区别就是对 store/reducer 的抽象,Flux 中 store 是各自为战的,每个 store 只对对应的 controller-view 负责,每次更新都只通知对应的 controller-view;而 Redux 中各子 reducer 都是由根reducer统一管理的,每个子reducer的变化都要经过根reducer的整合。用图表示的话可以像这样:


Flux 中的 store 是这样的:

图片:r1.PNG



Redux 中的 store(或者叫 reducer)是这样的:

图片:r2.PNG



1. 解决问题


通过对数据流的限制来保证state的变化可预测
注:所谓可预测就是指数据的走向清晰,就像拓扑图一样使数据沿着预定的顺序行走,这就是单项数据流的好处

2. 如何限制数据流

通过redux三大定律
  • 单一数据源:整个应用的state存储在一个js对象中
保证的数据流的终点固定。
     

图片:r3.png


  • state为只读:所谓只读就是只能取数据,不能直接在state改数据,如果想要修改state当且仅当触发action(dispatch一个action)才可修改
保证了数据流的起点
  • 使用纯函数执行修改
     使用reducer规定如何修改state,reducer本身是一个纯函数,接收state与action作为参数,纯函数好处在于输入确定,输出也会确定
     //这就是一个reducer函数,负责处理action,返回新的state
     function reducerDemo(state,action){
     switch (action.type) {
     .....
     注:函数内部不可直接修改state,可通过拷贝方式返回新的state
     }
     }
保证了修改过程中数据流输出可预测

3.redux组成
  1. action
     action就是一个js对象,保存actiontype与data(行为所需数据),为保证data的复用性一般使用action creator(以data为参数的函数)生成action
  2. reducer
     reducer是一个纯函数,定义了state如何被修改
     const initialState = '';      //拆分的state
     function reducer1 (state = initialState,action) {      //拆分的reducer
     switch (action.type) {
     ....
     }
     }
     考虑到当应用复杂的情况下reducer与state会变得非常臃肿,redux采取了先拆分后合并的方式来处理state与reducer
     import { combineReducers } from 'redux';
     import reducer1 from './xxx';
     import reducer2 from './xxx';
     const rootReducer = combineReducers({
     reducer1,
     reducer2
     });
     这样combineReducers会将拆分的state与reducer
  3. store
     redux中提供了createStore函数,它以rootReducer为参数返回store
     const store = createStore(rootReducer);

参考:https://www.jianshu.com/p/a1b59e8ecb5e

https://blog.csdn.net/special_programmer/article/details/81287631
https://segmentfault.com/a/1190000011474522?utm_source=tag-newest
知识需要管理,知识需要分享
游客


返回顶部

公众号

公众号