希望以下代码用帮助大家理解 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 };
}
});
2
FaiChou 2019-09-10 10:42:13 +08:00 1
这不就是 egghead 上 Dan 的视频教程内容么 ?
不过这个 redux 教程对新手启发还是挺大的 |
3
banxi1988 OP @FaiChou #2 egghead 上的视频我没有看,改天学习一下.
我近期也录了一个对应视频. 我感觉自己实现一遍就算是极简的实现也比单纯的看技术文章介绍的好. |