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