进化 Flux

我们可以先通过对比 Redux 和 Flux 的实现来感受一下 Redux 带来的惊艳。

首先是 action creators,Flux 是直接在 action 里面调用 dispatch:

  1. export function addTodo(text) {
  2. AppDispatcher.dispatch({
  3. type: ActionTypes.ADD_TODO,
  4. text: text
  5. });
  6. }

Redux 把它简化成了这样:

  1. export function addTodo(text) {
  2. return {
  3. type: ActionTypes.ADD_TODO,
  4. text: text
  5. };
  6. }

这一步把 dispatcher 和 action 解藕了,很快我们就能看到它带来的好处。

接下来是 Store,这是 Flux 里面的 Store:

  1. let _todos = [];
  2. const TodoStore = Object.assign(new EventEmitter(), {
  3. getTodos() {
  4. return _todos;
  5. }
  6. });
  7. AppDispatcher.register(function (action) {
  8. switch (action.type) {
  9. case ActionTypes.ADD_TODO:
  10. _todos = _todos.concat([action.text]);
  11. TodoStore.emitChange();
  12. break;
  13. }
  14. });
  15. export default TodoStore;

Redux 把它简化成了这样:

  1. const initialState = { todos: [] };
  2. export default function TodoStore(state = initialState, action) {
  3. switch (action.type) {
  4. case ActionTypes.ADD_TODO:
  5. return { todos: state.todos.concat([action.text]) };
  6. default:
  7. return state;
  8. }

同样把 dispatch 从 Store 里面剥离了,Store 变成了一个 pure function(state, action) => state

什么是 pure function

如果一个函数没有任何副作用(side-effects),不会影响任何外部状态,对于任何一个相同的输入(参数),无论何时调用这个函数总是返回同样的结果,这个函数就是一个
pure function。所谓 side-effects 就是会改变外部状态的因素
,比如 Ajax 请求就有
side-effects,因为它带来了不确定性。

所以现在 Store
不再拥有状态,而只是管理状态,所以首先要明确一个概念,Store 和 State
是有区别的,Store 并不是一个简单的数据结构,State 才是,Store
会包含一些方法来管理 State,比如获取/修改 State。

基于这样的 Store,可以做很多扩展,这也是
Redux 强大之处。

来源:@dan_abramov/the-evolution-of-flux-frameworks-6c16ad26bb31">The Evolution of Flux Frameworks