redux模块对象:createStore, combineReducers
A. createStore
- createStore(reducer) : 接收一个reducer函数,返回一个store对象
- store对象:
getState() 得到内部state对象
dispatch(action) 分发action,触发reducer调用,返回一个新的state,调用所有绑定的listener
subscribe(listener) 订阅一个state监听器
function createStore(reducer) {
//内置一个state对象
let state
//内部保存n个listener的数组
let listeners = []
//初始化state并且保存
state = reducer(state, {type:'@mini-redux'})
//得到内部管理的state对象
function getState(){
return state
}
//订阅一个state监听器
function subscribe(listener){
return listeners.push(listener)
}
//分发action,会触发reducer调用,返回一个新的state,调用所有绑定的listener
function dispatch(action){
//调用reducer,返回新的state并保存
state = reducer(state,action)
//调用listeners中所有监视的回调函数
listeners.forEach(listener => {
listener ()
})
}
return {getState, dispatch, subscribe}
}
B. combineReducers
1.接收一个包含多个reducer函数的对象,返回一个reducer函数
function combineReducers(reducers) {
//reducers = {msg:msgReducer,say:sayReducer}
//获取object键名
let keys = Object.keys(reducers)
return function (state = {}, action) {
let newState={}
keys.forEach(key => {
//获取每一个reducer
const childReducer = reducers[key]
//获取每一个reducer对应的state
const childState = state[key]
const childNewState = childReducer(childState, action)
newState[key] = childNewState
})
return newState
}
}
//简写上一个方法
function combineReducers2(reducers) {
let keys = Object.keys(reducers)
return function (state = {}, action) {
keys.reduce((newState, key) => {
newState[key] = reducers[key](state[key], action)
return newState
}, {})
}
}