• applyMiddleware 原理


    首先用法

    在createstore(reducers,applyMiddleware())

    在封装createstore的参数的时候,进行了判断,createstore的参数是三个分别是reducer, preloadedState, enhancer,也可以是两个,如果第二个是对象那么第2参数就是preloadedState,如果是函数那么参数就是enhancer,传是三个点时候,第三个参数是函数就是enhancer,也就是也可以写成createstore(reducers,preloadedState,applyMiddleware())

    1. if (
    2. (typeof preloadedState === 'function' && typeof enhancer === 'function') ||
    3. (typeof enhancer === 'function' && typeof arguments[3] === 'function')
    4. ) {
    5. throw new Error(
    6. 'It looks like you are passing several store enhancers to ' +
    7. 'createStore(). This is not supported. Instead, compose them ' +
    8. 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.'
    9. )
    10. }
    11. if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {
    12. enhancer = preloadedState
    13. preloadedState = undefined
    14. }
    15. if (typeof enhancer !== 'undefined') {
    16. if (typeof enhancer !== 'function') {
    17. throw new Error(
    18. `Expected the enhancer to be a function. Instead, received: '${kindOf(
    19. enhancer
    20. )}'`
    21. )
    22. }
    23. return enhancer(createStore)(reducer, preloadedState)
    24. }

    从参数看来,形参传的applyMiddleware()就是对应的enhancer,在applyMiddleware实际上是执行了一次 const store = createStore(...args)  也就是就会获得store的发方法,例如getstate,diapatsh,而重点是里面引入了compose方法这个方法是用来处理在中间件里面的方法的,,例如thuck,saga,首先chain里面存着这些saga等方法,然后通过compose处理这些方法,处理方式是,从右到左,第一个函数的返回值作为第二个函数的参数,依次执行,而最后就会返回一个新的dispatsh,注意:compose的第二个括号里面的参数,也就是中间件函数最后一个参数函数的参数,是store.dispatsh然后把store,与最新的dispatsh返回出去

    applyMiddleware

     

    compose

    当参数多的时候就通过reduce的方法进行归并,然后最后返回值是第一个参数函数的返回结果

     bindActionCreators

    bindActionCreators是redux的一个自带函数,作用是将单个或多个ActionCreator转化为dispatch(action)的函数集合形式。

    开发者不用再手动dispatch(actionCreator(type)),而是可以直接调用方法。

    实现方式是,通过for of 遍历判断创建的actionCreators文件夹里的key是不是一个函数是的换就通过改变this指向的发方法,给你自动执行dispatsh

     combineReducers

    他的作用是在模块化的时候进行合并reducers,也就是combineReducers(r1,r2)的时候会给你合并成一个完整的reduce ,然后把这个合并的reduce丢给createstore

    createStore

    首先返回

    dispatch,用于派发action,处理store里面的state的更新

     subscribe, 是用于进行监听,当state改变了会干什么

        getState, 是为了获取state

        replaceReducer,这个方法可以更新当前 store 使用的 reducers, 可以利用这个方法在每次需要插入 reducer 时更新 store,

        [$$observable]: observable,

    实现方式:首先三个参数reducer, preloadedState, enhancer,上面applyMiddleware讲了参数怎么判断的

    在createStore里面有个listeners数组是用来存在sbusricb里监听的发方法,有个getstate是return这个store的state,最重要的方法是dispatsh方法,里面传了action参数,执行了一次reduce并且把值赋值给state,然后遍历了下listeners数组里面的所有的监听事件并且刚开始执行了一次dispatsh,

     

     还有在源码中有个nextListeners === currentListeners是为了防止在一个组建中执行着3所有的监听,在一个组件里面就unsubscribe,避免报错

  • 相关阅读:
    “两利四率” 、“两增一控三提高” 央企考核指标解读
    第三章 将对象映射到 XML - 使用列表或数组定义的属性
    echart 三角形柱状图
    Socket网络编程练习题四:客户端上传文件(多线程版)
    Web 3.0顶级干货教学:Web2.0 时代的问题?
    概率论与数理统计(1)——基本概念
    redis哨兵系列1
    安卓Frida 脱壳
    一种速度引导的哈里斯鹰优化算法
    Qt对象树
  • 原文地址:https://blog.csdn.net/m0_66195841/article/details/125548351