本文转自《浅谈React、Flux 与 Redux》,转载请注明出处。

React

  React 是一个 View 层的框架,用来渲染视图,它主要做几件事情:

  • 组件化
  • 利用 props 形成单向的数据流
  • 根据 state 的变化来更新 view
  • 利用虚拟 DOM 来提升渲染性能

  前面说到 React 能够根据 state 的变化来更新 view,一般来说引起 state 变化的动作除了来自外部(如服务器),大部分都来自于页面上的用户活动,那页面上的用户活动怎样对 state 产生作用呢?React 中每个组件都有 setState 方法用于改变组件当前的 state,所以可以把更改 state 的逻辑写在各自的组件里,但这样做的问题在于,当项目逻辑变得越来越复杂的时候,将很难理清 state 跟 view 之间的对应关系(一个 state 的变化可能引起多个 view 的变化,一个 view 上面触发的事件可能引起多个 state 的改变)。我们需要对所有引起 state 变化的情况进行统一管理,于是就有了 Flux。

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 主要包括四个部分, 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 是这样的:

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

  ps:刚接触 React,很多地方了解地不是特别深入,如有错漏,欢迎指正。

转载于:https://www.cnblogs.com/lishuxue/p/6126645.html

【转】浅谈React、Flux 与 Redux相关推荐

  1. 浅谈 React 生命周期

    浅谈 React 生命周期 浅谈 React 生命周期 旧版的生命周期 新版的生命周期 详解各个生命周期函数 constructor getDerivedStateFromProps render c ...

  2. 浅谈react和vue

    浅谈React 和 Vue 相同之处: React 和 Vue 有许多相似之处,它们都有: ·       使用 Virtual DOM ·       提供了响应式 (Reactive) 和组件化 ...

  3. 浅谈 React Fiber

    2016 年都已经透露出来的概念,这都 9102 年了,我才开始写 Fiber 的文章,表示惭愧呀.不过现在好的是关于 Fiber 的资料已经很丰富了,在写文章的时候参考资料比较多,比较容易深刻的理解 ...

  4. 浅谈React虚拟DOM

    为什么要使用虚拟DOM 因为浏览器的DOM渲染是非常消耗性能的,很低效,我们使用虚拟DOM是为了提高DOM的渲染性能: 什么是虚拟DOM 虚拟DOM就是把真实的DOM树通过createElement转 ...

  5. Java防止Xss注入json_浅谈 React 中的 XSS 攻击

    作者:陈吉 转发链接:https://mp.weixin.qq.com/s/HweEFh78WXLawyQr_Vsl5g 前言 前端一般会面临 XSS 这样的安全风险,但随着 React 等现代前端框 ...

  6. 【转载】浅谈React编程思想

    React是Facebook推出的面向视图层开发的一个框架,用于解决大型应用,包括如何很好地管理DOM结构,是构建大型,快速Web app的首选方式. React使用JavaScript来构建用户界面 ...

  7. 浅谈react hook ( ref)

    import React ,{useRef,useState,PureComponent} from "react"; import ReactDOM from "rea ...

  8. 浅谈React和VDom关系

    组件化 组件的封装 组件的复用 组件的封装 视图 数据 视图和数据之间的变化逻辑 import React, {Component} from 'react';export default class ...

  9. 浅谈React与jQuery的思维差异

    为什么越来越多的互联网公司都在转向React.js去开发前端组件,除了性能因素外,很大一部分原因是因为用jQuery去写很复杂的DOM操作,后期代码会变得越来越难维护.现在大部分的 Web APP 都 ...

最新文章

  1. 解读zookeeper的配置项
  2. C++sparse matrix 稀疏矩阵的实现算法(附完整源码)
  3. 推荐一篇关于多租户Multi-Tenant数据架构的文章
  4. Zlib解压/压缩实现
  5. 公共云计算彼端的数据能否得到有效保护?
  6. JDK神坑:JAVA中Calendar的月份Month少1
  7. 强制更改wifi名前缀CMCC
  8. 12306中前端验证身份证件(及其他证件号)的方法
  9. html5如何引用百度地图api,WebApp如何调用百度地图API
  10. 使用 matplotlib 绘制文氏图(venn)
  11. XMLHttpRequest 状态码:readyState、status
  12. 数据可视化——seaborn(二)
  13. 如何在Excel表中快速提取想要的数据
  14. fluent当中的梯度宏和VOF梯度的获取【转载】
  15. 屏幕录制方法?如何在电脑进行屏幕录制
  16. 智能电动车骑行头盔安全帽方案/APP/PCBA/小程序/开发
  17. 【Keil编译警告】warning C316:unterminated conditionals
  18. seo搜索引擎优化,seo搜索引擎优化名词解释
  19. 2022安全员-C证考试模拟100题及在线模拟考试
  20. vb6.0发送邮件 html,VB6.0调用jmail发送邮件

热门文章

  1. File类的创建功能
  2. Egret在Chrome浏览器中的内存占用(内存泄露)
  3. Codeforces 744C. Hongcow Buys a Deck of Cards(状压DP)
  4. 读入字符串/字符 scanf与getchar/gets区别
  5. [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用...
  6. 诗与远方:无题(二十五)
  7. Kafka版本介绍Version2.4.0
  8. 1的准确率_库存准确率总是100%正常吗?
  9. 单片机学c语言还是python好_单片机开发用哪种语言最好?
  10. Js双引号和单引号使用注意事项