Redux 是目前 React 框架最火的状态管理工具,但是它与 React 没有任何关系,我们可以通过阅读源码并且模仿实现它才可以更为深刻的了解 Redux 的迷人之处,并且从源码中找出它的不足之处并尝试优化,为此你会如何实现它呢?
Activity
CodeRookie262 commentedon Dec 28, 2020
reducex的缺点
状态一改动就会触发订阅事件池的所有回调函数;
getState返回的是state的引用,用户可以直接通过引用修改状态,最好应该深克隆;
订阅函数中没有回调函数去重,导致可能相同的方法会多次push事件池;
状态更新触发订阅事件池,但是没有判断属性是否发生改变,因为是新的引用,所以应该遍历(虽然比较消耗性能)
如果有不怎么熟悉
redux建议先阅读中文文档createStore
createStore 函数用于创建并且返回一个状态操作对象,以下是对 store 对象的部分类型定义;
store 对象主要有有
getState,dispatch和subscribe这几个 API。getState用于获取最新的状态dispatch用于派发action对象进行状态更新subscribe用于监听状态变更知道这几个 API 的功能后我们之一来实现吧~
以上基本实现了
createStore。combineReducers
有的时候我们的状态是有模块区分的,就和
Vuex一样有多个module进行分开管理,避免多个状态一同处于同一级造成数据会造成难以维护,所以我们也需要对不同的状态进行划分,需要将reducer函数拆分成多个单独的函数对独自的状态状态管控。但是上文中的createStore只接受一个reducer,如何将多个reducer同时传进入呢?这个时候就是我们大哥
combineReducers的工作了,他接受一个对象,通过{reducer: reducerFun}形式的参数传递给combineReducers,combineReducers接收到参数后会返回一个reducer函数,将这个函数传递给createStore即可。applyMiddleware
以上是引用 redux 中文网
可以看出
applyMiddleware主要是通过 一个或者多个middleware包装store.dispatch。这个时候我们得给我的上面的
createStore函数进行一些参数的调整。我们先从单个中间件
middleware的思路入手更容易理解吧~基本的中间件注入是解决了,但是
applyMiddleware是支持多个中间件的,也就是说最后返回的dispatch只有一个,并且是经过了多个中间件修饰过的了。那么就有一个难点,就是如何获取最终的的dispatch呢?例如有
middleware1和middleware2,每个函数都接受原有的dispatch后返回新的dispatch,可以分解为:
所以我们是不是可以这样写呢 =>
middleware2(middleware2(dispatch));那我们可以封装一函数
compose将多个middleware组合成一个函数,这个函数接受一个的dispatch并返回最终的dispatch;在此之前我们可以看下
redux源码中的处理,我们可以在compose.js中看到这样一句代码,非常巧妙。可以看看简化后的代码
看完后是不是焕然大悟了哈哈哈,当然用 数组的
reduce还有另外的写法哟´( ̄▽ ̄)~*关于插件合并的问题我们基本解决了,接下来我们再次修改一下我们的
applyMiddleware函数。function applyMiddleware(...middleware){ return function(createStore){ return function(reducer){ // 创建 store let store = createStore(reducer); // 将 store 传入中间件 - let middle = middleware(store); + let middles = middleware.map(middle => middle(store)); // 将 dispatch 传入中间件返回的函数进行修饰,并返回 - let middleDispatch = middle(store.dispatch); + let middleDispatch = compose(...middles)(store.dispatch); return { ...store, dispatch: middleDispatch } } } }