简单的(10 多行代码) 基于 TypeScript 的 Redux 核心实现及应用

2019-09-05 12:31:46 +08:00
 banxi1988

希望以下代码用帮助大家理解 Redux 的工作原理.

createStore 函数实现如下:


type StoreListener = () => void;

interface Action {
  type: string;
}

interface State {}

function createStore<S extends State, T extends Action>(reducer: (state: S, action: T) => S) {
  let state: S = {} as any;
  const listeners: StoreListener[] = [];
  const getState = () => {
    return state;
  };
  const subscribe = (listener: StoreListener) => {
    listeners.push(listener);
    const unsubscribe = () => {
      const index = listeners.indexOf(listener);
      listeners.splice(index, 1);
    };
    return unsubscribe;
  };

  const dispatch = (action: T) => {
    state = reducer(state, action);
    listeners.forEach(listener => listener());
  };

  dispatch({ type: "" } as T);
  return { dispatch, subscribe, getState };
}

使用示例如下:


interface TodoAction extends Action {
  todo: Todo;
}

interface TodoState extends State {
  todos: Todo[];
}

const todoStore = createStore<TodoState, TodoAction>((state, action) => {
  if (!action.type) {
    const todos = [
      new Todo("学习 React", [BuiltinTag.IMPORTANT, BuiltinTag.URGENT]),
      new Todo("学习 TypeScript", [BuiltinTag.IMPORTANT]),
      new Todo("学习 CSS")
    ];
    return { ...state, todos };
  } else {
    const todos = state.todos.slice(); // 复制
    switch (action.type) {
      case TodoActionType.ADD:
        todos.push(action.todo);
        break;
      case TodoActionType.REMOVE:
        const index = todos.indexOf(action.todo);
        todos.splice(index, 1);
    }
    return { ...state, todos };
  }
});
2253 次点击
所在节点    JavaScript
3 条回复
banxi1988
2019-09-05 12:34:04 +08:00
@Livid 降级有什么什么解除降级的办法?(除了重新注册账号).
降级之后在问答区提问根本就看不到自己刚发的帖子.
FaiChou
2019-09-10 10:42:13 +08:00
这不就是 egghead 上 Dan 的视频教程内容么 ?
不过这个 redux 教程对新手启发还是挺大的
banxi1988
2019-09-11 07:31:17 +08:00
@FaiChou #2 egghead 上的视频我没有看,改天学习一下.
我近期也录了一个对应视频. 我感觉自己实现一遍就算是极简的实现也比单纯的看技术文章介绍的好.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/598174

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX