redux 单向数据流的由来

  1. Flux将应用分成四个部分;
  • view 视图层;
  • Action 视图层发出的消息;(改变store里面的数据)
  • Dispatch(派发器)
  • Store (数据层) : 用来存在应用的状态(数据),一旦发生变动,就要提醒view更新页面。

redux单向数据流:

具体详情请见阮一峰Flux架构入门

Action

  • 定义. Action 是把数据从应用(译者注:这里之所以不叫 view 是因为这些数据有可能是服务器响应,用户输入或其它非 view 的数据 )传到 store 的有效载荷。它是 store 数据的唯一来源。一般来说你会通过 store.dispatch() 将 action 传到 store。

  • 狭义的Action

let action = {type: 'ACTION_NAME',...
}
复制代码

注意: 一般 type 的内容使用 大写字母+下划线 的格式.

  • 广义的Action

    广义的 action 是指在中间件的支持下,dispatch 函数可以调用的数据类型,除了普通action之外,常见的有 thunk, promise 等。我们用常用的 thunk来举个例子

    什么叫thunk函数? 具体背景见阮一峰es6标准入门一书第17章Thunk函数的含义.在javaScript中函数将多参数函数替换成单参数的版本,且只接受回调函数作为参数。 例如:

var Thunk = function(fn){return function(){var args = Array.prototype.slice.call(arguments);return function(callback){args.push(callback);return fn.apply.(this,args);}}
}var readFileThunk = Thunk(fs.readFile);readFileThunk(fileA)(callback);
复制代码
Thunk函数版本的action:
复制代码
(dispatch, getState) => { //在函数体内可以使用 dispatch 方法来发射其他 action//在函数体内可以使用 getState 方法来获取当前的state
}
复制代码

ceateStore

通过该API创建一个store对象,该对象包含四个方法;

  1. getState();获取store中当前的状态。
  2. dispatch(action): 分发一个action,并返回这个action,这是唯一能改变store中数据的方式。
  3. subscribe(listener): 注册一个监听者,它在store发生变化时被调用。
  4. replaceReducer(nextReducer): 更新当前store里的reducer, 一般只会在开发模式中调用该方法。

redux middleware

  • Redux 是一个简单的同步数据流,当分发一个action时,reducer收到action后,更新state并通知view重新渲染。 当action发出后如果想要执行一些别的操作,该怎样处理,也就是说action发出后没有立即执行reducer,将redux变成异步. 这时就要借助中间件。

  • redux-middleware的数据流动.

  • 中间件的由来以及原理. 中间件的思想来源于koa. 核心思想:将middleware(函数)进行组合,将当前的middleware执行一遍作为参数传给下一个middleware去执行。

原理:

app.use((ctx, next) => {ctx.name = 'Lucy'next()
})app.use((ctx, next) => {ctx.age = 12next()
})app.use((ctx, next) => {console.log(`${ctx.name} is ${ctx.age} years old.`) // => Lucy is 12 years old.next()
})// ... 任意调用 use 插入中间件app.go({}) // => 启动执行,最后会调用 callback 打印 => { name: 'Lucy', age: 12  }
复制代码

ctx 参数就是 app.go 接受的对象。调用 app.go 其实会调用目标函数 app.callback,但是调用 app.callback 之前我们可以先让参数 ctx 通过一系列的中间件,最后才会传递给 app.callback。

使用 app.use 插入任意中间件,中间件是一个函数,可以被传入一个 ctx 和 next;调用 next 的时候会执行下一个中间件。如果不调用 next 会阻止接下来所有的中间件的执行,也不会执行 app.callback。

这里的app.use()就是一个实现中间件。

const app = {middleware:[],callback(){console.log(ctx);},use(fn){this.middleware.push(fn);},go(){const reducer = (next,fn,i)=> { fn(ctx,next)}this.middleware.reduceRight(reducer,this.callback.bind(this,ctx))();}
}
复制代码
  • redux的applyMiddleware的源码.
    function applyMiddle(){(next) => (reducer, initialState) => {let store = next(reducer,initialState);let dispatch = store.dispatch;let chain = [];let middlewarAPI = {getState:Store.getState,dispatch: (action) => { dispatch(action)}}chain = middlewares.map(middleware => middleware(middlewarAPI));dispatch = compose(...chain)(store.dispatch);return {...store,dispatch}}}
复制代码

一般这样应用middleware

const finalCreateStore = compose(applyMiddleware(...middleware)//DevTools.instrument()
)(createStore);const store = finalCreateStore(reducer);
复制代码

middleware的一般写法

const m1 = store => next => action => {let result = next(action);switch (action.type) {case APP_INCREMENT_LOADING:globalProgressBar.incrementLoading();break;case APP_DECREMENT_LOADING:globalProgressBar.decrementLoading();break;}return result;
};export default m1;复制代码

注:这里的compose函数请参考app.go或者参考上章FP一节; applyMiddle其实用了2个中间件的思想; 源码的详细解释:

作者个人博客: http://zhengchengwen.com 欢迎交流

转载于:https://juejin.im/post/5b17fd74f265da6e1d6ca9a5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/451530.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/451530.shtml
英文地址,请注明出处:http://en.pswp.cn/news/451530.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

冒泡排序与快速排序(java实现)

冒泡排序&#xff1a; public class bubbleSort {public static void bubbleSort1(int [] a, int n){int i, j;for(i0; i<n; i){//表示 n 次排序过程。for(j1; j<n-i; j){if(a[j-1] > a[j]){//前面的数字大于后面的数字就交换//交换 a[j-1]和 a[j]int temp;temp a[j…

Python中文编码问题详解

中文编码问题是用中文的程序员经常头大的问题&#xff0c;在python下也是如此&#xff0c;那么应该怎么理解和解决python的编码问题呢&#xff1f; 我们要知道python内部使用的是unicode编码&#xff0c;而外部却要面对千奇百怪的各种编码&#xff0c;比如作为中国程序经常要…

PHP环境搭建和Apache HTTP服务器配置

所需软件: 需要准备Apache HTTP 服务器: http://httpd.apache.org/download.cgi PHP环境下载:http://www.php.net/downloads.php Apache HTTP服务器安装: 由于最新的 Apache 已经不提供 Windows 的安装版本了&#xff0c;所以我们这里使用的是解压版。 下载地址&#xff1a;htt…

ElasticSearch安装过程中遇到的一些问题

问题1&#xff1a; 安装Elasticsearch5.X版本&#xff0c;不修改默认配置的情况下&#xff0c;一切还好&#xff0c;能够正常启动。但我必须开通外网访问。然后报错了&#xff0c;报错信息如下&#xff1a; ERROR: max file descriptors [1024] for elasticsearch process like…

Java原子操作类AtomicInteger应用场景

参考文章&#xff1a;Java原子操作类AtomicInteger应用场景 感谢作者分享&#xff01;

漂泊的足迹

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 似乎有河一样的蔓延 流淌过我被阳光翻晒过的身躯 你的足迹 是遥远的一个小岛 从不知名的地方漂泊而来

什么是MD5

MD5是message-digest algorithm 5&#xff08;信息-摘要算法&#xff09;的缩写&#xff0c;被广泛用于加密和解密技术上&#xff0c;它可以说是文件的“数字指纹”。任何一个文件&#xff0c;无论是可执行程序、图像文件、临时文件或者其他任何类型的文件&#xff0c;也不管它…

selenium使用js进行点击

WebElement button driver.findElement(By.xpath("/html/body/div[1]/div[3]/h2/div[2]")); JavascriptExecutor js (JavascriptExecutor) driver; js.executeScript("arguments[0].click();", button);当你使用driver原生API如果发现报错&#xff0c;或…

screenX clientX pageX的区别

screenX:鼠标位置相对于用户屏幕水平偏移量&#xff0c;而screenY也就是垂直方向的&#xff0c;此时的参照点也就是原点是屏幕的左上角。 clientX:跟screenX相比就是将参照点改成了浏览器内容区域的左上角&#xff0c;该参照点会随之滚动条的移动而移动。 pageX&#xff1a;参照…

进程的五种状态和线程的六种状态

参考文章&#xff1a; 进程的状态转换和线程的状态转换

谈谈对程序员的培养

这篇文章是我好久以来的想法&#xff0c;有一些感悟&#xff0c;有一些激烈的言辞&#xff0c;我很自豪我就是一名程序员&#xff0c;我希望给程序员或者前程序员们带来一点启发。也许你认可我的言辞&#xff0c;也许你不屑我的观点&#xff0c;无论如何&#xff0c;欢迎谈谈你…

我记得

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我记得在农村一片一片金色的稻田 , 碧绿的秧苗 , 我想起有风吹过的时候那金穗一层一层的翻滚 ... 是一际熟悉于往昔的海洋 , 那火黄的…

Python实现文件md5校验

Linux下校验文件MD5值&#xff0c;最简单的方法就是执行md5sum命令 md5sum filename 原本打算用subprocess调用系统命令来获取md5值&#xff0c; [python] view plaincopy print?import subprocess,shlex cmd "md5sum filename" p subprocess(shlex.split(cmd…

Nexus 安装(Linux 环境)

一、环境准备 安装 JDK 1.7 二、下载 Nexus 压缩文件 下载地址&#xff1a;http://www.sonatype.org/nexus/archived/ 三、上传压缩文件 四、解压缩文件 五、配置环境变量 1、临时配置 mvn clean package -Dmaven.test.skiptrue -Dmaven.javadoc.skiptrue命令&#xff1a;expor…

android 连接指定wifi

本文牵涉kotlin和rxjava的相关知识 //查询wifi信息需要申请权限&#xff0c;权限工具类就不要在意了&#xff0c;重点在下面 PermissionUtils.permission(PermissionConstants.LOCATION).callback(object : PermissionUtils.SimpleCallback {override fun onGranted() {//通过授…

英特尔预计5年内将成智能手机芯片大厂

北京时间4月26日早间消息&#xff0c;英特尔预计&#xff0c;英特尔在未来5年内将成为智能手机芯片市场的“重要参与者”。过去10年中&#xff0c;英特尔在这一市场的多次尝试都未能获得成功。 英特尔CFO斯泰西史密斯(Stacy Smith)表示&#xff1a;“英特尔并不满足于成为市场中…

java.util.UnknownFormatConversionException: Conversion = ‘,‘ 解决

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 报错&#xff1a; 2. 原因&#xff1a; 出错代码&#xff1a; if(info.getRiceCount() < 0){ ... } 事实上 对象的riceCoun属性值…

JAVA中获取当前系统时间

一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat;public class NowString { public static void main(String[] args) { SimpleDateFormat df new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式Sys…

爬虫中的关于字符串的一些理解

1.基本概念 字符(Character)是各种文字和符号的总称&#xff0c;包括各国家文字、标点符号、图形符号、数字等 字符集(Character set)是多个字符的集合 字符集包括&#xff1a;ASCII字符集、GB2312字符集、GB18030字符集、Unicode字符集等 ASCII编码是1个字节&#xff0c;而Uni…

分布式数据一致性

分布式系统数据一致性问题 感谢作者分享&#xff01;