You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reducer:根据当前的 state tree 和 要触发的 action 来生成并返回 新的(next)state tree
preloadedState: 可选的初始state
enhancer: 可选的用以增强 store 的 第三方能力
createStore返回一个 redux store 用以读取 state、触发 action 和 订阅 changes
3 内部流程
首先,判断 preloadedState 和 enhancer:
if(typeofpreloadedState==='function'&&typeofenhancer==='undefined'){enhancer=preloadedStatepreloadedState=undefined}if(typeofenhancer!=='undefined'){if(typeofenhancer!=='function'){thrownewError('Expected the enhancer to be a function.')}returnenhancer(createStore)(reducer,preloadedState)}
本文将学习 createStore,并实现一个简单的 createStore。
createStore
接下来就按照
createStore
的内部流程来解读。1 引入工具函数
createStore 引入的函数有:
2 参数声明
createStore接受三个参数:
createStore返回一个 redux store 用以读取 state、触发 action 和 订阅 changes
3 内部流程
首先,判断 preloadedState 和 enhancer:
所以
enhancer
应是一个 柯里化函数,如果给定了enhancer
则 直接调用reducer
和preloadedState
返回enhanced
的store
(当然也是 createstore生成 )。其次,判断 reducer 是否为函数,不是则报错:
紧接着,声明了以下变量:
然后 dispatch 初始化 action(dispatch({ type: ActionTypes.INIT })) (这样每个 reducer都会返回自己的初始状态,这样就有效地填充了 初始的 state tree)
最后返回一个对象:
4 dispatch (action)
dispatch 是唯一的触发 状态变化(state change)的途径,它只接受一个 isPlainObject 的 action,具体流程如下:
action
是否isPlainObject
,否则报错action.type
,没有则报错isDispatching
,如果是报错(目前无法dispatch action
)currentReducer
(传入的reducer
)5 subscribe
subscribe 接收一个
listener
函数,它首先ensureCanMutateNextListeners
(通过nextListeners = currentListeners.slice()
保存当前的监听函数 ),当初次ensures
时,nextListeners
为 [],然后将传入的listener
加入到nextListeners
,这样nextListeners
中便有了listeners
,这样在dispacth
中便有了 listeners便可以循环调用listeners
,同时subscribe返回一个包含取消监听函数的对象。6 模仿实现
目前可以简单总结下
createStore
返回一个主要包含(我说的主要)getState
、subscribe
和dispatch
。通过dispatch ation
调用reducer(currentState, action)
以完成change state
,那么接下来按照这个思路实现一个简单的createStore
:测试以下:
输出如下:
总结
通过阅读
createStore
的源码可以发现这部分的核心主要就是在reducer
、dispatch
以及state
,理清楚这些便明白了createStore
的简单与巧妙。The text was updated successfully, but these errors were encountered: