手写createStore
export default function createStore(reducer, DefaultState) { let currentState = DefaultState, currentReducer = reducer let listeners = []; function isPlainObject() { if (typeof reducer === "object") { return false; } return Object.getPrototypeOf(reducer) === Object.prototype } function dispatch(action) { if (!isPlainObject) { throw new Error("must be a plain object") } if (action.type === undefined) { throw new Error("must has a property of type") } currentState = currentReducer(currentState, action); for (const listener of listeners) { listener(); } } function getState() { return currentState; } /** * @author qian * @name 监听器 * @param {监听函数} listener */ function subscribe(listener) { listeners.push(listener); let isRemove = true; return () => { if (isRemove) { const index = listeners.indexOf(listener); listeners.splice(index, 1); isRemove = false; } } } function replaceReducer(newReducer) { currentReducer = newReducer; } //初建库时需要分发一次action dispatch({ type: "@@redux/INIT" + Math.random().toString().substr(2, 7).split("").join(".") }) return{ dispatch, getState, subscribe, replaceReducer } }