react系列笔记:第二记-中间件
中间件所做的事情就是在action发起后,到reducer之前做扩展,实现的方式是对store的dispatch进行包装
store.dispatch => 【middlewales】 => return new store.dispatch
所以从上面所知,middlewales是需要接受store的dispatch为参数的,为了进行state的一些操作比如跟踪state变化,则把getState也一同传入
middlewales(store.dispatch,store.getState) = > return new dispatch
然后applyMiddleWales基本上做了一件事就是遍历了middlewales
applyMiddleWales(store,[middlewals1,.....]) => return new store.dispatch
官网上也在实现上分了两步进行解释大致的实现
第一部分:这个比较简单,就是把store传下去,然后把dispatch重新返回来,当然在这之间可以做些什么再返回来,比如添加log,捕获错误等
const logger1 =(store) => {
const next = store.dispatch
return (action)=>{
console.log('log1---start')
let o = next(action);
console.log('log1---end')
return o;
}
}
const logger2 = (store) => {
const next = store.dispatch;
return (action) =>{
console.log('log2----start');
let o = next(action);
console.log('log2-----end')
return o;
}
}
const store = {
dispatch:()=>{console.log('dispatch----')}
}
function middle(store,wales){
wales.forEach(item => {
store.dispatch = item(store)
})
}
middle(store,[logger1,logger2])
//打印:
//log2 --start
//log1--start
//dispacht
//log1--end
//log2--end
第二步:这里把middlewales的调用方式改变了一下,前面是middle(store) => return dispatch,这里是middls(store)(dispatch) => return dispatch
这么做的好处是不是直接在store身上直接去扩展dispatch,而是把dispatch从源头传出来,然后返回新的dispatch,最后生成的也是store的一个副本。
const newLog1 = (store)=>{
return (next) => {
return (action) =>{
console.log('newLog1---start')
let o = next(action);
console.log('newLog1---end');
return o;
}
}
}
const newLog2 = (store)=>{
return (next) => {
return (action) =>{
console.log('newLog2---start')
let o = next(action);
console.log('newLog2---end');
return o;
}
}
}
newLog2(store);//此时这个返回的是一个函数,(next) => return (action)=>{}
newLog2(store)(store.dispatch)//此时返回的是一个函数 (action)=>{}
const newStore = {
dispatch:() => console.log('newStore dispatch-----')
}
const newMiddle = (store,wales) =>{
let dispatch = store.dispatch;
wales.forEach(item => {
dispatch = item(store)(dispatch);
})
return {...store,dispatch};
}
const ns = newMiddle(newStore,[newLog1,newLog2]);
react系列笔记:第二记-中间件的更多相关文章
- react系列笔记1 用npx npm命令创建react app
react系列笔记1 用npx npm命令创建react app create-react-app my-app是开始构建新的 React 单页应用程序的最佳方式.它已经为你设置好了开发环境,以便您可 ...
- react系列笔记:第三记-redux-saga
github : https://github.com/redux-saga/redux-saga 文档:https://redux-saga.js.org/ redux-saga: redux中间 ...
- react系列笔记:第一记-redux
前言: 目前公司使用dva,对于前不久还是使用原生js的我来说,花了差不多一两周时间,基本掌握如何使用.虽然对于react有一点点基础,但很多地方未深入,很多概念也很模糊,故从本文开始,记录一下系统的 ...
- The Road to learn React书籍学习笔记(第二章)
The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存.修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状 ...
- Java系列笔记(3) - Java 内存区域和GC机制
目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...
- Java系列笔记(1) - Java 类加载与初始化
目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用. 每个类编译后产生一个 ...
- Java系列笔记(6) - 并发(上)
目录 1,基本概念 2,volatile 3,atom 4,ThreadLocal 5,CountDownLatch和CyclicBarrier 6,信号量 7,Condition 8,Exchang ...
- hdu4508 完全背包,湫湫系列故事——减肥记I
湫湫系列故事——减肥记I 对于01背包和完全背包,昨晚快睡着的时候,突然就来了灵感 区别:dp[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值 在第二重循环,01 是倒着循环的,因 ...
- Cocos2dx游戏开发系列笔记13:一个横版拳击游戏Demo完结篇
懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 ) 写下这些东西的同时 旁边放了两部电影 周星驰的<还魂夜> 甄子丹的<特殊身份& ...
随机推荐
- windows中的软链接硬链接等
学校嘛,有些时候还是得逆逆上网客户端啥的,并且学校的不少工作,这Windows的需求还是挺强的,之前Win10的体验并不是太好,不过时隔这么久,打算从7升级到10了,恰好系统也该换了. 首先是命令行的 ...
- SPOJ 1811 LCS - Longest Common Substring
思路 和SPOJ 1812 LCS2 - Longest Common Substring II一个思路,改成两个串就有双倍经验了 代码 #include <cstdio> #includ ...
- docker更改默认仓库地址
zq@ubuntu:~$ docker pull -h Flag shorthand -h has been deprecated, please use --help Usage: docker p ...
- 【SSL Certificates】什么是数字证书(Certificates)?
本文涉及的相关问题,如果你的问题或需求有与下面所述相似之处,请阅读本文 ssl certificate 什么是ssl certificates? SSL Certificates 是一种使用数字加密技 ...
- Java将string内容写入到TXT文件
private static String filePath = "E:\\test.txt"; private static void saveAsFileWriter(Stri ...
- `vue-router`的`History`模式下的项目发布
背景 脚手架版本号:vue cli 3.x 项目路由:vue-router的History模式 原理:url路由处理逻辑从后端转移到前端. 参考:https://developer.mozilla.o ...
- C# Selenium 破解腾讯滑动验证
什么是Selenium? WebDriver是主流Web应用自动化测试框架,具有清晰面向对象 API,能以最佳的方式与浏览器进行交互. 支持的浏览器: Mozilla Firefox Google C ...
- @staticmethod和@classmethod
一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某些应 ...
- jmeter 上传附件 如图片
1.要勾选 Use multipart/form-data for POST,否则request中将不包含上传的文件 2.MIME类型为application/octet-stream 图如下:对应 ...
- 跟踪mqttv3源码(二)
对于spring-mqtt.xml中的标签: <int-mqtt:message-driven-channel-adapter> <int-mqtt:outbound-channel ...