• 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,避免报错

  • 相关阅读:
    SAP S4 FI后台详细配置教程- PART3 (财务凭证相关配置篇)
    力扣(104.101)补9.7
    机器视觉的试卷批改系统 - opencv python 视觉识别 计算机竞赛
    SSM框架-获取容器的方式
    HTML的有序列表、无序列表、自定义列表
    JUC02-多场景下的线程同步操作
    IP组播简介
    文件包含漏洞(二)
    [NLP] LLM---<训练中文LLama2(二)>扩充LLama2词表构建中文tokenization
    JS基本数据类型中null和undefined区别及应用
  • 原文地址:https://blog.csdn.net/m0_66195841/article/details/125548351