redux 简单实现
最近学习了一下redux趁热撸一个简单版帮助记忆
//创建createStore
export function createStore(reducer,enhancer){
if(enhancer){
return enhancer(createStore)(reducer);
}
let currentState = undefined;
let currentListeners = [];
function getState(){
return currentState
}
function dispatch(action){
currentState = reducer(currentState,action)
currentListeners.map(cb=>cb())
}
function subscribe(listener){
currentListeners.push(listener)
}
dispatch({ type: "@LJDOM-REDUX" });//初始化state
return {
getState,
dispatch,
subscribe,
}
}
//创建applyMiddleware
export function applyMiddleware(...middle){
return createStore => (...reduce) =>{
let store = createStore(...reduce);
let middlewareAPI={
getState: store.getState,
dispatch: store.dispatch
}
//执行中间件函数传入参数
let chain = middle.map(mdw => mdw(middlewareAPI));
//按顺序执行中间件返回包装过的dispatch
let dispatch = compose(...chain)(store.dispatch);
return{
...store,
dispatch
}
}
}
//按顺序嵌套中间件 [f1,f2,f3] => f3(f2(f1()))
function compose(...funcs) {
const len = funcs.length;
if (len === 0) {
return arg => arg;
}
if (len === 1) {
return funcs[0];
}
return funcs.reduce((left, right) => (...args) => right(left(...args)));
}
//reducer
function reducer(state=0,action){
switch(action.type){
case 'add':
return state +1;
default:
return state;
}
}