1993klk / blog

记点东西
1 stars 0 forks source link

redux的源码学习 #3

Open 1993klk opened 4 years ago

1993klk commented 4 years ago

Redux对象组成

redux库导出了createStore,combineReducers,bindActionCreators,applyMiddleware,compose,DO_NOT_USEActionTypes这几个成员。

1、createStore

in:reducer, preloadedState, enhancer out:{dispatch,subscribe,getState,replaceReducer,[$$observable]: observable} 内部存储了currentReducer,currentState,currentListeners,nextListeners,isDispatching这几个变量。

reducer就是redux概念上的reducer,接受preState和acticon,返回state preloadedState为预设的state,生成初始化state enhancer为使用applyMiddleware函数调用过后返回的函数,若存在enhancer,则会通过enhancer调用自身createStore,并返回store

dispatch:接受action,返回action。不能在reducers中调用dispatch。每次调用,会调用reducer,将当前的state和action传入,生成新的state并保存,将nextListeners赋值给currentListeners,之后遍历当前监听者队列并调用监听者。

subscribe:不能在reducer中执行subscribe,理论上是注册单个监听器使用的。每次注册监听器,都生成currentListeners的一份浅拷贝,将其赋值给nextListeners,将监听器推入nextListeners中,并返回取消监听的方法。一旦调用,生成currentListeners的一份浅拷贝,将其赋值给nextListeners,并将通过闭包保留的监听器对象从nextListeners中删除 getState:返回currentState变量 replaceReducer:接受reducer,替换当前reducer,并立即发起一次类型为ActionTypes.REPLACE的action observable:返回包含subscribe和$$observable函数成员的对象,subscribe用于一次性注册多个监听器的场景,通过此subscribe注册的多个监听器。$$observable调用返回observable

2、combineReducers

in: reducers 多个reducer组成的对象 out: reducer 转化为一个reducer函数 内部函数名称combination reducers是多个reducer组成的,combineReducers会将reducers中值不为函数的键值对剔除。对象,key对应最后生成的state的key,value是对应key的reducer函数。 调用combination会依次调用reducers里的函数并返回返回的state

3、bindActionCreators

in:actionCreators dispatch out:boundActionCreators actionCreators为多个actionCreator函数组成的对象,bindActionCreators会将actionCreators中值不为函数的键值对剔除,通过内部的bindActionCreator方法将会生成新的函数,该函数中会调用dispatch和actionCreator,故传入数据,调用同名action时就会发起一次dispatch。

4、applyMiddleware

in:middlewares out:enhancer 接受中间件,返回增强器 增强器分步接受createStore,preloadedState,enhancer,返回store对象。其中,中间件数组元素被调用,接受getState和包含错误处理的dispatch并返回函数列表,后通过compose将函数列表和store.dispatch进行组合,形成发起action后执行中间件的dispatch。

5、compose

in:funcs out:func 实现原理是通过数组reduce方法将函数列表组合成一个函数,按照函数逆序,后一个函数的调用结果作为前一个函数的入参依次调用

6、DO_NOT_USEActionTypes

包含INIT,REPLACE,PROBE_UNKNOWN_ACTION三个不能被使用的ActionTypes,用于redux发起特定的action。