1.初始化数据javascript
let currentReducer = reducer let currentState = preloadedState //存放state,preloadedState是传入的默认值 let currentListeners = [] //存放subscribe传入的listener let nextListeners = currentListeners
2.建立dispatch, subscribe, getState等方法java
1.执行reducergit
currentReducer(currentState, action)
2.执行listenergithub
const listeners = (currentListeners = nextListeners) for (let i = 0; i < listeners.length; i++) { const listener = listeners[i] listener() }
nextListeners.push(listener)
return currentState
const applyMiddleware = (...middlewares) => createStore => (...args) => { const 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 store = createStore(...args) let dispatch = () => { throw new Error( `Dispatching while constructing your middleware is not allowed. ` + `Other middleware would not be applied to this dispatch.` ) } let chain = [] const middlewareAPI = { getState: store.getState, dispatch: (...args) => dispatch(...args) } chain = middlewares.map(middleware => middleware(middlewareAPI)) //*1 middlewareAPI是store dispatch = compose(...chain)(store.dispatch) //*2 ...chain和store.dispatch是next return { ...store, dispatch } //*3 执行dispatch传入action }
compose是函数式编程的用法用于简化函数嵌套执行编程
const logger = store => next => action => { console.log('dispatching', action) let result = next(action) console.log('next state', store.getState()) return result }
为何会变成 store => next => action => ?redux
(见注释)app