<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <script type="text/javascript" src="./js/babel.js"></script> </head> <body></body> </html> <script> function compose(...funcs) { if (funcs.length === 0) { return (arg) => arg; } if (funcs.length === 1) { return funcs[0]; } return funcs.reduce((a, b) => (...args) => a(b(...args))); } const loggerMiddleware = ({ getState, dispatch }) => (next) => (action) => { console.log(getState(), action.type, 'before'); next(action); console.log(getState(), action.type, 'after'); }; const thunkMiddleware = ({ getState, dispatch }) => (next) => (action) => { if (typeof action === 'function') { return action({ getState, dispatch }); } else { return next(action); } }; function applyMiddleware(...middleWares) { return (createStore) => (reducer) => { const store = createStore(reducer); const chains = middleWares.map((m) => m({ getState: store.getState, dispatch: (action) => store.dispatch(action), }) ); const dispatch = compose(...chains)(store.dispatch); return { ...store, dispatch, }; }; } function createStore(reducer, enhancer) { if (typeof enhancer !== 'undefined' && typeof enhancer === 'function') { return enhancer(createStore)(reducer); } let currentState = 0; let currentListeners = []; // 监听器,可监听多个事件 const getState = function () { return currentState; }; const subscribe = (listener) => { currentListeners.push(listener); }; const dispatch = (action) => { if (typeof action === 'function') { console.log('function action not support '); return; } currentState = reducer(currentState, action); // 覆盖原来的state currentListeners.forEach((listener) => listener()); }; // 尽量写得复杂,使不会与我们自定义的action有重复可能 dispatch({ type: '@@redux/init' }); return { getState, subscribe, dispatch, }; } const defaultState = { value: 10, }; function reducer(state = defaultState, action) { switch (action.type) { case 'add': return state + 1; // ... default: return state; } } // enhancer = applyMiddleware(loggerMiddleware); // const store = createStore(reducer, enhancer); const enhancer = applyMiddleware(loggerMiddleware, thunkMiddleware); const store = createStore(reducer, enhancer); //同步action, action是一個對象 const add = () => ({ type: 'add' }); store.dispatch(add()); //同步action,action是一個函數 const addAsyn = () => { return ({ dispatch, getState }) => { setTimeout(() => { dispatch(add()); }, 5000); }; }; store.dispatch(addAsyn()); // console.log(store); </script>
人生旅途,边走边看...