统一状态管理

114 阅读1分钟

测试代码

it("基本功能 订阅通知 改变状态", () => {
    const { createStore } = require("../index");
    const mockFn = jest.fn();
    const reducer = (state = { num: 1 }, payload) => {
        switch (payload.type) {
            case "clear":
                return { num: 0 };
            case 'add':
                return { num: state.num++ };
            default:
                return state;
        }
    }
    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);
});

功能实现

let store;
let effects = []
module.exports = {
    createStore: (reducer) => {
        let dispatch = (payload) => {
            store = reducer(store, payload)
            effects.forEach(item => item())
        }
        let effect = (fn) => {
            effects.push(fn);
        }
        let getState = () => {
            return store
        }
        return {
            dispatch,
            effect,
            getState
        }
    }
}