二话不说 轮子我都会造 还怕你面试问吗? 一天造一个轮子,干就完了。前端
(计划赶不上变化 随时迭代 欢迎留言 随时摸鱼)git
若是编写一个复杂的前端程序,不太可能让组件各自为政。状态和行为逻辑都分散在各自组件内部,很难统一管理,那也就很难作大.好比: 你们想一想作一个在线版的Excel或者PS 又或者后面咱们要写的VSCode应该怎么作?里面的各类组件互动,Undo、Redo、行为记录怎么作?在线版王者荣耀如何播放视频录像,如何直播?github
要完成这样的功能须要三个要求:面试
单一数据源 : 就是状态数据统一放在一块儿算法
保持状态只读 : 状态数据谁都不能改,须要改的话找管理员赞成修改设计模式
数据修改使用纯函数 : 修改数据的方法也要统一管理,这样容易回退,记录复现、时间旅行markdown
状态通知 : 状态修改能够获得通知,固然不少人都要收听这个最好使用订阅发布模式。这个不是刚需,我就一个地方用用怎么了。谁变了我整个视图都刷新。因此我们拆解开,此次只知足能触发状态变动通知就好了。后面设计模式我们在慢慢盘这些东西。app
it("基本功能 订阅通知 改变状态", () => {
const { createStore } = require("../index");
const mockFn = jest.fn();
const store = createStore(reducer);
// 创建响应订阅
store.effect(mockFn);
store.dispatch({
type: "clear",
});
// store.dispatch({ type: "add", payload: 1 });
const calls = mockFn.mock.calls;
// 断言 mock方法只调用一次
expect(calls.length).toBe(1);
expect(store.getState().num).toBe(0);
});
复制代码
超级简单是吧 我就解释了框架
module.exports.createStore = (reducer, preloadedState) => {
let currentReducer = reducer; //reducer函数
let currentState = preloadedState; //默认state
let effective
return {
getState() {
return currentState;
},
dispatch(action) {
currentState = currentReducer(currentState, action);
// 触发通知
effective()
},
effect(fn) {
effective = fn;
},
};
};
复制代码
OK 任务完成异步
主要是咱们拆解了和统一状态管理不强绑定的问题。
固然这个实现订阅发布模式就好了
大概两个方案Thunk方案 和 Promise方案 这个等咱们后续分别造完Thunk和 Promise轮子再说
这个须要引入中间件洋葱圈模型也就是实现责任链模式
这个须要实现备忘录设计模式