• 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]);
  • 相关阅读:
    C# RabbitMQ
    使用HttpClient和WebRequest时POST一个对象的写法
    HTTP中application/x-www-form-urlencoded字符说明
    MVC5 Entity Framework学习
    SQL Server安全
    Entity Framework查询
    COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问。最新解决方案
    js中精度问题以及解决方案
    string.format
    t-sql对被除数为0&除数小于被除数结果为0&除法保留2位小数的处理
  • 原文地址:https://www.cnblogs.com/laojun/p/9124133.html
Copyright © 2020-2023  润新知