中间件所做的事情就是在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系列笔记:第二记-中间件的更多相关文章

  1. react系列笔记1 用npx npm命令创建react app

    react系列笔记1 用npx npm命令创建react app create-react-app my-app是开始构建新的 React 单页应用程序的最佳方式.它已经为你设置好了开发环境,以便您可 ...

  2. react系列笔记:第三记-redux-saga

    github : https://github.com/redux-saga/redux-saga 文档:https://redux-saga.js.org/ redux-saga:  redux中间 ...

  3. react系列笔记:第一记-redux

    前言: 目前公司使用dva,对于前不久还是使用原生js的我来说,花了差不多一两周时间,基本掌握如何使用.虽然对于react有一点点基础,但很多地方未深入,很多概念也很模糊,故从本文开始,记录一下系统的 ...

  4. The Road to learn React书籍学习笔记(第二章)

    The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存.修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状 ...

  5. Java系列笔记(3) - Java 内存区域和GC机制

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

  6. Java系列笔记(1) - Java 类加载与初始化

    目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用. 每个类编译后产生一个 ...

  7. Java系列笔记(6) - 并发(上)

    目录 1,基本概念 2,volatile 3,atom 4,ThreadLocal 5,CountDownLatch和CyclicBarrier 6,信号量 7,Condition 8,Exchang ...

  8. hdu4508 完全背包,湫湫系列故事——减肥记I

    湫湫系列故事——减肥记I 对于01背包和完全背包,昨晚快睡着的时候,突然就来了灵感 区别:dp[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值 在第二重循环,01 是倒着循环的,因 ...

  9. Cocos2dx游戏开发系列笔记13:一个横版拳击游戏Demo完结篇

    懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 ) 写下这些东西的同时 旁边放了两部电影 周星驰的<还魂夜> 甄子丹的<特殊身份& ...

随机推荐

  1. Bootstrap3基础 栅格系统 列中有行,行中有列

      内容 参数   OS   Windows 10 x64   browser   Firefox 65.0.2   framework     Bootstrap 3.3.7   editor    ...

  2. RESTClient的基本使用

    1.本人使用的是火狐浏览器,其他浏览器应该也有(没试过),安装插件RESTClient. 2.1.打开RESTClient:

  3. flutter插件汇总

    audio_recorder: any #录音.播放 flutter_sound: ^#录音 dropdown_menu: ^#下拉菜单 simple_permissions:#权限获取 easy_a ...

  4. Spring Boot 线程池

    参考 SpringBoot 线程池 程序猿DD-Spring Boot使用@Async实现异步调用:自定义线程池 如何优雅的使用和理解线程池 Spring Boot线程池的使用心得 博客园-Sprin ...

  5. 2019-4-21 - plan

    设计模式 idea中demo 在test1中使用单例测试ok

  6. hdu2159 FATE----完全背包

    标准完全背包板子,动态方程为dp[j][x]=max(dp[j][x],dp[j-c[i]][x-1]+a[i]); 其中,dp[j][x]表示花费j点耐心杀x个怪所能得到的最大经验值. 具体代码如下 ...

  7. c# mongodb drive IngoreExtraElements and RegisterClassMap

    private static void RegisterClassMaps(IEnumerable<Type> clrTypes) { foreach (var clrType in cl ...

  8. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group t1,customer t2

    ### SQL: select t1.gid,t1.gname,t1.gvalue,t1.gtype, t1.gaddress,t1.gmembers, t1.gcode,t1.gphone, t2. ...

  9. php LBS(附近地理位置)功能实现的一些思路

    在开发中经常会遇到把数据库已有经纬度的地方进行距离排序然后返回给用户 例如一些外卖app打开会返回附近的商店,这个是怎么做到的呢? 思路一: 根据用户当前的位置,用计算经纬度距离的算法逐一计算比对距离 ...

  10. 创建X个任意元素数组并且可以遍历的的一个方法

    方法一: Array.apply(null, { length: 20 })分析:apply 第二个参数应该是数组,现在把 { length: 20 } 转化为数组,就是一个长度为X的数组(类数组对象 ...