从零撸一个Redux
扯一扯
这段时间在看 Redux 的东西,稍微梳理一下整个框架的流程。其实整个 Redux 的代码很少,现在我也不能理解很多它的思想,反正先撸出个简单的 Redux 吧。目标是照着它的流程写一个最简单的,也要支持异步 Action。也算是个笔记性的东西。
Action
这里把 Action 放到了 Store 中,这样在 Component 中使用的时候只要导入 store 就可以,不用导入很多的 Action, 就是懒。当然也可以使用 React-Redux 之类的进行绑定,但是这个库主要不是干这个的。。这个后面会提到一些。因为 Actions 都是提前定义的,所有写在了一个 StoreConfig 中,在创建 Store 的时候就可以把 actions 注入到 Store 中了。当然你也可以不这么做。先贴一下完整的代码吧
|
|
Reducer
这里的 Reducer 只创建了一个,就是直接把成功的数据更新到 Store 中,也没什么好看的,关于异步的 Promise 会在结果返回之后再去通知 Reducer去更新 Store,当然这就不是这个 Reducer 的工作了。代码很简单。
|
|
Store
我觉得 Redux 的最重要的东西就是 Store 了。所有的 Action 都要经过 Store 分发,当结果返回之后也要通知 Store 去更新,Component 的数据也是从 Store 中获取。先贴一下 CreateStore 代码
|
|
这里偷懒用了一些库,但是仅仅是很简单的几个方法,例如 import {handleActions} from 'redux-actions'; 这个里面的代码我没看的懂,但是知道返回一个类似arrays.reduce的function,这个可以理解返回一个 rootReducer ,也就是会迭代累加调用所有的 Reducer 。generateStore 也是抄了一部分的源码,大致的原理应该差不多。从这个也会发现一个问题,每当 dispatch 一个 action 都会去遍历所有的 listeners ,我们一般都是在 listener 中去做更新 UI 的工作,这样就会造成很多次无用的刷新。这个就可以使用上面提到过的 React-Redux 的 mapStateToProps 在某个 Component 中只去接受自己感兴趣的 State 的更新,然后再使用类似 Immutable 的库进去比较就可以很好的控制更新。当然这里不会多去说这个,因为我也没具体去理解过,以后可以多去学习学习。
这里还偷懒直接用了 redux 中的 applyMiddleware。我觉得这是我学习 Redux 中看到的最精彩的代码,贴一下
|
|
通过和上面的 generateStore 一起看,特别是 applyMiddleware 返回的匿名Function,真是精彩的代码。再去试想一下如果使用 Java 这样的强类型语言去实现得是多麻烦的事情。还有就是 Function 的一等公民地位的体现。真的值得多去读一读,很赞。不得不去佩服写这段代码的人。甚至有点自举的感觉。在还没创建 store 的时候就可以去使用 Store.dispatch,(这句话是有问题的,意会即可)。还有就是 applyMiddleware 的整个过程其实没有完全的弄明白,这里也不班门弄斧,等明白了会再来更新的。
结束
最后就是使用了,没什么好说的store.dispatch(store.actions.testAsync());就可以了。使用手动的 subscribe 或者 React-redux 的 connect 都能实现 UI 的更新,当然更推荐后者。后面还会去学习一个 React-Redux 这个东西,毕竟又使用 React 又使用 Redux 肯定也少不了这个东西。
先说到这吧,有什么想说的再来补一补。