首先用法
在createstore(reducers,applyMiddleware())
在封装createstore的参数的时候,进行了判断,createstore的参数是三个分别是reducer, preloadedState, enhancer,也可以是两个,如果第二个是对象那么第2参数就是preloadedState,如果是函数那么参数就是enhancer,传是三个点时候,第三个参数是函数就是enhancer,也就是也可以写成createstore(reducers,preloadedState,applyMiddleware())
- 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.'
- )
- }
-
- if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {
- enhancer = preloadedState
- preloadedState = undefined
- }
-
- if (typeof enhancer !== 'undefined') {
- if (typeof enhancer !== 'function') {
- throw new Error(
- `Expected the enhancer to be a function. Instead, received: '${kindOf(
- enhancer
- )}'`
- )
- }
-
- return enhancer(createStore)(reducer, preloadedState)
- }
从参数看来,形参传的applyMiddleware()就是对应的enhancer,在applyMiddleware实际上是执行了一次 const store = createStore(...args) 也就是就会获得store的发方法,例如getstate,diapatsh,而重点是里面引入了compose方法这个方法是用来处理在中间件里面的方法的,,例如thuck,saga,首先chain里面存着这些saga等方法,然后通过compose处理这些方法,处理方式是,从右到左,第一个函数的返回值作为第二个函数的参数,依次执行,而最后就会返回一个新的dispatsh,注意:compose的第二个括号里面的参数,也就是中间件函数最后一个参数函数的参数,是store.dispatsh然后把store,与最新的dispatsh返回出去
applyMiddleware
compose
当参数多的时候就通过reduce的方法进行归并,然后最后返回值是第一个参数函数的返回结果
bindActionCreators是redux的一个自带函数,作用是将单个或多个ActionCreator转化为dispatch(action)的函数集合形式。
开发者不用再手动dispatch(actionCreator(type)),而是可以直接调用方法。
实现方式是,通过for of 遍历判断创建的actionCreators文件夹里的key是不是一个函数是的换就通过改变this指向的发方法,给你自动执行dispatsh
他的作用是在模块化的时候进行合并reducers,也就是combineReducers(r1,r2)的时候会给你合并成一个完整的reduce ,然后把这个合并的reduce丢给createstore
首先返回
dispatch,用于派发action,处理store里面的state的更新
subscribe, 是用于进行监听,当state改变了会干什么
getState, 是为了获取state
replaceReducer,这个方法可以更新当前 store 使用的 reducers, 可以利用这个方法在每次需要插入 reducer 时更新 store,
[$$observable]: observable,
实现方式:首先三个参数reducer, preloadedState, enhancer,上面applyMiddleware讲了参数怎么判断的
在createStore里面有个listeners数组是用来存在sbusricb里监听的发方法,有个getstate是return这个store的state,最重要的方法是dispatsh方法,里面传了action参数,执行了一次reduce并且把值赋值给state,然后遍历了下listeners数组里面的所有的监听事件并且刚开始执行了一次dispatsh,
还有在源码中有个nextListeners === currentListeners是为了防止在一个组建中执行着3所有的监听,在一个组件里面就unsubscribe,避免报错