[Redux/Mobx] 说说Redux的实现流程

通过分析redux的几个核心api,来看如何实现redux

  • store.subscribe: 订阅数据的变化
  • store.dispatch:dispatch后改变state,同时通知store.subscribe函数执行,上面这两个函数可以利用发布-订阅模式
  • store.getState: 通过这个函数直接返回内存中的state变量即可
    简单的实现如下
export function createStore(reducer, enhancer) {if (enhancer && typeof enhancer === 'function') {const newCreateStore = enhancer(createStore);const newStore = newCreateStore(reducer);return newStore;}let state;              // state记录所有状态let listeners = [];     // 保存所有注册的回调function subscribe(callback) {listeners.push(callback);       // subscribe就是将回调保存下来}// dispatch就是将所有的回调拿出来依次执行就行function dispatch(action) {state = reducer(state, action);for (let i = 0; i < listeners.length; i++) {const listener = listeners[i];listener();}}// getState直接返回statefunction getState() {return state;}// store包装一下前面的方法直接返回const store = {subscribe,dispatch,getState}return store;
}export function combineReducers(reducerMap) {const reducerKeys = Object.keys(reducerMap);    // 先把参数里面所有的键值拿出来// 返回值是一个普通结构的reducer函数const reducer = (state = {}, action) => {const newState = {};for (let i = 0; i < reducerKeys.length; i++) {// reducerMap里面每个键的值都是一个reducer,我们把它拿出来运行下就可以得到对应键新的state值// 然后将所有reducer返回的state按照参数里面的key组装好// 最后再返回组装好的newState就行const key = reducerKeys[i];const currentReducer = reducerMap[key];const prevState = state[key];newState[key] = currentReducer(prevState, action);}return newState;};return reducer;
}// 参数支持多个中间件
export function applyMiddleware(...middlewares) {function enhancer(createStore) {function newCreateStore(reducer) {const store = createStore(reducer);// 多个middleware,先解构出dispatch => newDispatch的结构const chain = middlewares.map(middleware => middleware(store));const { dispatch } = store;// 用compose得到一个组合了所有newDispatch的函数const newDispatchGen = Redux.compose(...chain);// 执行这个函数得到newDispatchconst newDispatch = newDispatchGen(dispatch);return {...store, dispatch: newDispatch}}return newCreateStore;}return enhancer;}

个人简介

我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易,
但坚持一定很酷。欢迎大家一起讨论

主目录

与歌谣一起通关前端面试题

[Redux/Mobx] 说说Redux的实现流程相关推荐

  1. [Redux/Mobx] 在redux中,什么是action?

    [Redux/Mobx] 在redux中,什么是action? action是Redux中定义一个响应的动作,action总是有一个type属性,作为这个动作的唯一标识; Reducer函数则会根据这 ...

  2. [Redux/Mobx] 为什么redux能做到局部渲染呢?

    [Redux/Mobx] 为什么redux能做到局部渲染呢? reducer从根往最子级的reducer中间各层总是返回一个新的state,这样的话,就会引起组件的大范围的re-render,但是这是 ...

  3. [Redux/Mobx] 在Redux中怎么发起网络请求?

    [Redux/Mobx] 在Redux中怎么发起网络请求? 如果单纯的使用Redux,因为redux的actionCreator返回一个plain object,所以不能在actionCreator中 ...

  4. [Redux/Mobx] 说说redux的优缺点分别是什么?

    [Redux/Mobx] 说说redux的优缺点分别是什么? 优点 Redux轻量,生态丰富,可以结合流行的redux-thunk.redux-saga等进行使用 Redux的写法比较固定,团队应用中 ...

  5. [Redux/Mobx] 在redux中,什么是store?

    [Redux/Mobx] 在redux中,什么是store? 单一数据源,整个应用数据保存的地方 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目 ...

  6. Redux/Mobx面试题汇总

    [Redux/Mobx] redux和flux的区别是什么? [Redux/Mobx] 什么是redux?说说你对redux的理解?有哪些运用场景? [Redux/Mobx] 在React中你是怎么对 ...

  7. 浅析前端状态管理Redux Mobx Vuex

    写在前面 前端技术的发展日新月异,vue,react,angular等的兴起,为我们带来了新的开发体验.但随着技术的革新,以及前端页面复杂度的提升,对应有localStorage,eventBus,v ...

  8. Mobx 与 Redux 的性能对比

    在本文中你将看到我最终得出的结论是 Mobx 的性能优于 Redux.但很明显这样的结论是片面的,甚至是有失偏颇的,因为我只选取了一个的场景对两者进行测试.可能真实的情况恰恰相反,Mobx 仅仅在我测 ...

  9. [Redux/Mobx] Redux怎么添加新的中间件?

    [Redux/Mobx] Redux怎么添加新的中间件? applyMiddleware 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌 ...

最新文章

  1. golang平滑重启
  2. 基于SIFT特征的全景图像拼接
  3. 微信小程序中input和picker之间切换导致input无法失去焦点
  4. cad 打开硬件加速卡_为什么我能用CAD“飙车”?因为我用了这些加速秘笈
  5. 常见Java面试题之解释内存中的栈、堆和静态区用法
  6. x64版本的OpenGL库配置
  7. Dede cms文章内容管理系统安全漏洞!如何有效防止DEDE织梦系统被挂木马安全设置...
  8. 【ZOJ - 3963】Heap Partition (STLset,二叉树的性质,构造,贪心,思维)
  9. sift算法_单应性Homograph估计:从传统算法到深度学习
  10. python解析html的库_python自带的用于解析HTML的库HtmlParser
  11. 白噪音和粉红噪音煲机_10小时煲机后,HIFIMAN TWS600给你不一样的听觉盛宴
  12. Java中调用本地代码
  13. 安卓webview开发简介
  14. latex怎么改字体大小_latex更改字体 latex局部字体大小
  15. OGRE里,MAYA模型导出MESH格式模型方法
  16. CTF—图片隐写+数据隐写
  17. 新课发布-SpringBoot2.0缓存中间件Redis技术入门与实战(抢红包系统设计与实战)
  18. openstack 制作windows镜像,创建windows虚拟机,虚拟机添加virt-io驱动
  19. CV15 轮廓检测:霍夫变换原理及应用
  20. 【报告分享】2021年一季度楼市总结-58安居客房产研究院(附下载)

热门文章

  1. java http2_探索HTTP/2: HTTP 2协议简述(原)
  2. Siamese网络(孪生神经网络)详解
  3. 5886. 如果相邻两个颜色均相同则删除当前颜色
  4. 编译原理—语法分析器(Java)
  5. leetcode278. 第一个错误的版本(二分查找)
  6. leetcode1219. 黄金矿工(回溯)
  7. leetcode712. 两个字符串的最小ASCII删除和(动态规划)-Gogo
  8. python:__new__()与__init__()
  9. TCP/IP分析(一) 协议概述
  10. Python 日期和时间戳的转换