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 ) 写下这些东西的同时 旁边放了两部电影 周星驰的<还魂夜> 甄子丹的<特殊身份& ...
随机推荐
- 论文阅读:Siam-RPN
摘要 Siam-RPN提出了一种基于RPN的孪生网络结构.由孪生子网络和RPN网络组成,它抛弃了传统的多尺度测试和在线跟踪,从而使得跟踪速度非常快.在VOT实时跟踪挑战上达到了最好的效果,速度最高16 ...
- C语言: 简易图书管理系统
这只是一个简易的图书管理系统,虽然它有千余行代码,不过终究是个简单基本的东西. 在Linux系统下,用Vim编写,如要在Windows上运行则需要一些改动,主要是一些调用系统函数的改动.如Window ...
- L1范数与L2范数
L1范数与L2范数 L1范数与L2范数在机器学习中,是常用的两个正则项,都可以防止过拟合的现象.L1范数的正则项优化参数具有稀疏特性,可用于特征选择:L2范数正则项优化的参数较小,具有较好的抗干 ...
- struts.xml,报错 1 c.opensymphony.xwork2.util.DomHelper
ERROR c.opensymphony.xwork2.util.DomHelper - The content of element type "action" must mat ...
- python小游戏
import time,random # 需要的数据和变量放在开头player_list = ['[狂血战士]','[森林箭手]','[光明骑士]','[独行剑客]','[格斗大师]','[枪弹专家] ...
- vue--动画收缩
首先 install vuex 创建store文件夹 在 store 文件夹分别建立 state.js // 状态管理 // 定义state 原始数据 const state = { fullScre ...
- js三元表达式
条件 ? true的时候执行 : false时候执行 const x = 20; let answer; if (x > 10) { answer = 'greater than 10'; } ...
- Rails6新增rails db:system:change更换数据库
rails db:system:change --to=postgresql rails db:system:change --to=mysql rails db:system:change --to ...
- JS中for循环变量作用域
http://www.cnblogs.com/zhus/p/6513741.html 博主写得很好
- windows 安装xadmin
1.访问github :https://github.com/sshwsfc/xadmin 2.新建README.rst 并替换到下载的zip文件中 3.cmd下,进入虚拟环境使用pip instal ...