中间件所做的事情就是在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,捕获错误等

  1. const logger1 =(store) => {
  2. const next = store.dispatch
  3. return (action)=>{
  4. console.log('log1---start')
  5. let o = next(action);
  6. console.log('log1---end')
  7. return o;
  8. }
  9. }
  10.  
  11. const logger2 = (store) => {
  12. const next = store.dispatch;
  13. return (action) =>{
  14. console.log('log2----start');
  15. let o = next(action);
  16. console.log('log2-----end')
  17. return o;
  18. }
  19. }
  20.  
  21. const store = {
  22. dispatch:()=>{console.log('dispatch----')}
  23. }
  24.  
  25. function middle(store,wales){
  26. wales.forEach(item => {
  27. store.dispatch = item(store)
  28. })
  29. }
  30.  
  31. middle(store,[logger1,logger2])
  32.  
  33. //打印:
  34. //log2 --start
  35. //log1--start
  36. //dispacht
  37. //log1--end
  38. //log2--end

第二步:这里把middlewales的调用方式改变了一下,前面是middle(store) => return dispatch,这里是middls(store)(dispatch) => return dispatch

这么做的好处是不是直接在store身上直接去扩展dispatch,而是把dispatch从源头传出来,然后返回新的dispatch,最后生成的也是store的一个副本。

  1. const newLog1 = (store)=>{
  2. return (next) => {
  3. return (action) =>{
  4. console.log('newLog1---start')
  5. let o = next(action);
  6. console.log('newLog1---end');
  7. return o;
  8. }
  9. }
  10. }
  11.  
  12. const newLog2 = (store)=>{
  13. return (next) => {
  14. return (action) =>{
  15. console.log('newLog2---start')
  16. let o = next(action);
  17. console.log('newLog2---end');
  18. return o;
  19. }
  20. }
  21. }
  22.  
  23. newLog2(store);//此时这个返回的是一个函数,(next) => return (action)=>{}
  24. newLog2(store)(store.dispatch)//此时返回的是一个函数 (action)=>{}
  25.  
  26. const newStore = {
  27. dispatch:() => console.log('newStore dispatch-----')
  28. }
  29. const newMiddle = (store,wales) =>{
  30. let dispatch = store.dispatch;
  31. wales.forEach(item => {
  32. dispatch = item(store)(dispatch);
  33. })
  34. return {...store,dispatch};
  35. }
  36. 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. iOS has conflicting provisioning settings 解法

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  2. loadrunner常用函数集锦

    一.三个复制函数的区别: strcpy 原型:extern char *strcpy(char *dest,char *src);用法:#i nclude功能:把src所指由NULL结束的字符串复制到 ...

  3. Struts2---动态action以及应用

    为了处理各种逻辑业务,根据execute方法来判断请求哪种业务,然后将请求转发到对应的业务处理上, 通过动态请求action对象中的方法,实现某个单一的业务逻辑处理. 动态action的应用 //创建 ...

  4. 【python 3】 集合方法操作汇总

    基本数据类型 : set 集合(set)特点 : 无序 不能重复(自动去重) 用 {} 或 set()函数 来表示集合 空集合 : set() 1 name = {"江户部柯南", ...

  5. 兼容ie8的前端下载方法

    背景:在xp系统上 ie8浏览器的下载需求,后端返回资源路径. 方法:谷歌下采用aDown下载,ie采用window.open 触发下载,如果不能自动自动下载,采用execCommand(" ...

  6. [原]osg模型动画|骨骼动画

    参考源码:osg的官方例子:osganimationviewer 首先制作一个带骨骼动画的模型  demo.FBX 这里面我们做了两个骨骼动画:1.open   2.close 下面开始在osg中使用 ...

  7. Java /C# 实现文件压缩

    纯粹为了记录. 参考了 https://www.cnblogs.com/zeng1994/p/7862288.html import java.util.List; import java.util. ...

  8. 规则引擎 drools

    https://www.jianshu.com/p/725811f420db 深入了解Drools 简单介绍 笔者正在做风控系统,风控系统里边存在非常多的规则(比如:age < 16 || ag ...

  9. idea在本地调试,spark创建hiveContext的时候报错

    spark版本:1.6.1 scala版本:2.10 问题呢场景: 在idea调试本地程序的时候创建hiveContext报错,上午的时候是没有这个问题的,下午在项目中写了一个小deamon,出现了而 ...

  10. 浅谈企业IT技术运营中台

    关注嘉为科技,获取运维新知 如果你是IT圈内的人,在2月份,你的朋友圈里面最火的词应该就是“中台”了,我们在此不讨论企业的技术中台.数据中台.AI中台.业务中台,想和大家讨论一下IT技术运营中台. “ ...