美文网首页
读redux源码

读redux源码

作者: 南枫小谨 | 来源:发表于2021-07-26 14:01 被阅读0次

准备工作

redux 工作流程

  1. 首先由用户发出action store.dispatch(action)
  2. store 自动调用reducer 并传入两个参数当前 State 和收到的 Action,reducer 会返回新的state
  3. state有变化 store 会调用监听函数
    4.视图需设置监听函数store.subscribe(listener)
    5.listener可以通过store.getState()得到当前状态

总结

  1. createStore 创建store
  2. reducer 初始化、修改状态函数(用户自己定义传入)
  3. getState 获取状态值
  4. dispatch 提交更新
  5. subscribe 变更订阅

createStore

以下为精简部分代码,感兴趣直接去github 上下载源码

export default function createStore<
  S,
  A extends Action,
  Ext = {},
  StateExt = never
>(
  reducer: Reducer<S, A>,
  enhancer?: StoreEnhancer<Ext, StateExt>
// createStore  入参有两个 一个reducer 一个enhancer 用来使用中间件增强函数
):
 let currentState = preloadedState as S   //内部的state,用来存储数据
  let currentListeners: (() => void)[] | null = []   // 用来存放订阅回调的数组
let nextListeners = currentListeners

if (typeof enhancer !== 'undefined') { // 如果 enhancer 不为空 则返回一个增强的 createStore
return enhancer(createStore)(
reducer,
preloadedState as PreloadedState<S>
) as Store<ExtendState<S, StateExt>, A, StateExt, Ext> & Ext
}

 function getState(): S {
    // 返回 当前state 外部可以通过 store.getState()获取
    return currentState as S
  }
function subscribe(listener: () => void){
     nextListeners.push(listener)   // 将callback 放入 监听数组,当state 发生改变的时候会遍历调用
        return function unsubscribe() {   // 同时返回一个取消订阅的函数
               const index = nextListeners.indexOf(listener)
               nextListeners.splice(index, 1)
              currentListeners = null
    }
}
function dispatch(action: A) {
     currentState = currentReducer(currentState, action)  //   此处调用reducer 将state 传入
// 调用绑定监听回调
    const listeners = (currentListeners = nextListeners)   
    for (let i = 0; i < listeners.length; i++) {
      const listener = listeners[i]
      listener()
    }

    return action
  }

最后返回

const store = {
    dispatch: dispatch as Dispatch<A>,
    subscribe,
    getState,
    replaceReducer,
    [$$observable]: observable
  } as unknown as Store<ExtendState<S, StateExt>, A, StateExt, Ext> & Ext
  return store

applyMiddleware

  const store = createStore(reducer, preloadedState)
 const middlewareAPI: MiddlewareAPI = {
        getState: store.getState,
        dispatch: (action, ...args) => dispatch(action, ...args)
      } // 将 控制权包装一下
      const chain = middlewares.map(middleware => middleware(middlewareAPI)) // 将控制权传给中间件
      dispatch = compose<typeof dispatch>(...chain)(store.dispatch) // 通过 compose 函数 将中间件串联起来

      return {
        ...store, 
        dispatch // 返回包装后的dispatch
      }

compose 函数 用来组合各种中间件

function compose(...funs){
    if(funs.length === 0){
        return (arg)=>arg
    }
    if(funs.length === 1){
        return funs[0]
    }
    return funs.reduce((a,b)=>(...args)=>a(b(...args)))
}

未完 待续

相关文章

  • 读redux源码

    准备工作 redux 工作流程 首先由用户发出action store.dispatch(action) sto...

  • Redux源码全篇浅读

    本文是关于 redux(3.7.2)源代码的一些浅读 在redux源码目录中 ,可以看到以下文件目录: 与文件对应...

  • redux源码阅读——applyMiddleware

    redux源码——applyMiddleware 相关源码展示 applyMiddleware源码 compose...

  • redux源码分析

    这篇文章会很长。redux源码读起来并不困难。读懂redux的源码有利于更好的使用redux。但是react-re...

  • 【Redux】源码简读

    笔记系列,逻辑不太清晰。主要是用大白话,记录一下两类 state 的区别(之前自己有点小迷糊) 想了想,还是发布吧...

  • redux 源码阅读

    redux 源码阅读 首先从 redux 的官方示例来看 redux 的作用 这样简单一看的话, redux 感觉...

  • 重读redux源码

    之前5.1假期的时候,有去读了下redux的源码,当时感触很深,今天重新梳理遍redux的源码:从源码中的src文...

  • 学习redux,vuex看这几篇文章就够了(原理及源码剖析)

    Redux从设计到源码Vuex框架原理与源码分析

  • Redux源码解读

    今天向大家简单介绍下Redux源码,若有理解差误,欢迎在下面留言~ Redux源码地址:https://githu...

  • redux的使用(二)--redux-actions

    安装 源码:https://github.com/redux-utilities/redux-actions[ht...

网友评论

      本文标题:读redux源码

      本文链接:https://www.haomeiwen.com/subject/ipzwmltx.html