// 判断是否为纯对象
function isPlainObject(obj) {
if (typeof obj !== 'object' || obj === null) return false
let proto = obj
while (Object.getPrototypeOf(proto)) {
proto = Object.getPrototypeOf(proto)
}
return Object.getPrototypeOf(obj) === proto
}
function createStore(reducer, initState) {
if (typeof reducer !== 'function') {
throw new Error('reducer必须是一个函数')
}
let currentReducer = reducer
let currentState = initState
let currentListeners = []
function despatch(action) {
if (!isPlainObject(action)) {
throw new Error('action 必须事一个纯对象')
}
if (typeof action.type === 'undefined') {
throw new Error('action type 属性不能是 undefined')
}
currentState = currentReducer(currentState, action)
currentListeners.forEach(it => it())
return action
}
function subscribe(cb) {
let flag = true
currentListeners.push(cb)
return () => {
if (!flag) return
const index = currentListeners.findIndex(it => it === cb)
currentListeners.splice(index, 1)
flag = false
}
}
function getState() {
return currentState
}
dispatch({ type: '@@redux/INIT' })
return {
getState,
subscribe,
despatch
}
}
Redux 源码实现
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...