Redux源码分析——3,创建Store

创建Store

大多数还是报错。我们不用关心报错。

//ps和e都是函数,报错。
//e和参数四是函数,报错。
if (
	(typeof preloadedState === 'function' && typeof enhancer === 'function') ||
	(typeof enhancer === 'function' && typeof arguments[3] === 'function')
) {
    
    
	throw new Error(
		'It looks like you are passing several store enhancers to ' +
		'createStore(). This is not supported. Instead, compose them ' +
		'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.'
	)
}
//ps是函数,没有e。
//ps赋值给e。清除ps。
if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {
    
    
	enhancer = preloadedState as StoreEnhancer<Ext, StateExt>
	preloadedState = undefined
}
//e有,不是函数,报错。
if (typeof enhancer !== 'undefined') {
    
    
	if (typeof enhancer !== 'function') {
    
    
		throw new Error(
			`Expected the enhancer to be a function. Instead, received: '${
      
      kindOf(
				enhancer
			)}'`
		)
	}
	//调用e。
	return enhancer(createStore)(
		reducer,
		preloadedState as PreloadedState<S>
	) as Store<ExtendState<S, StateExt>, A, StateExt, Ext> & Ext
}
//reducer不是函数,报错。
if (typeof reducer !== 'function') {
    
    
	throw new Error(
		`Expected the root reducer to be a function. Instead, received: '${
      
      kindOf(
			reducer
		)}'`
	)
}
let currentReducer = reducer
let currentState = preloadedState as S
let currentListeners: (() => void)[] | null = []
let nextListeners = currentListeners
let isDispatching = false

1,如果有e,而且是函数。调用它。

调用e,参数是当前方法。返回值是个函数,继续调用它。
e相当于是一个createStore。
会跳过后续步骤。

return enhancer(createStore)(
	reducer,
	preloadedState as PreloadedState<S>
) as Store<ExtendState<S, StateExt>, A, StateExt, Ext> & Ext

2,状态预热。

reducer,初始状态,订阅者数组。

let currentReducer = reducer
let currentState = preloadedState as S
let currentListeners: (() => void)[] | null = []

3,next赋值current。

let nextListeners = currentListeners

4,关闭标记。

let isDispatching = false

阶段总结

1,双缓冲机制

每次current复制一份给next。

next:负责修改。
添加和移除,都是操作它。

current:负责查询。
查询时,next赋值给current,然后遍历current。

2,标记管理

isDispatching:是否正在操作中。
每次dispatch时,打开它。
操作完毕,关闭它。
其他操作时,只要true就报错。

isSubscribed:订阅状态。
如果true,表示还没取消。
只有true时才进行取消操作。

猜你喜欢

转载自blog.csdn.net/qq_37284843/article/details/123645289