9.2.1 增强器接口
您可以在百度里搜索“深入浅出React和Redux 艾草文学(www.321553.xyz)”查找最新章节!
9.2.1 增强器接口
Redux提供的创建Store的函数叫createStore,这个函数除了可以接受reducer和初始状态(preloadedState)参数,还可以接受一个Store Enhancer作为参数,Store Enhancer是一个函数,这个函数接受一个createStore模样的函数为参数,返回一个新的createStore函数。
所以,一个什么都不做的Store Enhancer长得这个样子,代码如下:
const doNothingEnhancer = (createStore) => (reducer, preloadedState, enhancer) => {
const store = createStore(reducer, preloadedState, enhancer);
return store;
};
上面的例子中,最里层的函数体可以拿到一个createStore函数对象,还有应该传递给这个createStore函数对象的三个参数。所以,基本的套路就是就是利用所给的参数创造出一个store对象,然后定制store对象,最后把store对象返回去就可以。
注意
在实际执行过程中,这里的createStore参数未必是Redux默认的createStore函数,因为多个增强器也可以组合使用,所以这里接收到的createStore参数可能是已经被另一个增强器改造过的函数。当然,每个增强器都应该互相独立,只要遵循统一接口,各个增强器可以完全不管其他增强器的存在。
实现一个Store Enhancer,功夫全在于如何定制产生的store对象。
一个store对象中包含下列接口:
·dispatch
·subscribe
·getState
·replaceReducer
每一个接口都可以被修改,当然,无论如何修改,最后往往还是要调用原有对应的函数。
例如,如果我们想要增强器给每个dispatch函数的调用都输出一个日志,那么就实现一个logEnhancer,代码如下:
const logEnhancer = (createStore) => (reducer, preloadedState, enhancer) => {
const store = createStore(reducer, preloadedState, enhancer);
const originalDispatch = store.dispatch;
store.dispatch = (action) => {
console.log('dispatch action: ', action);
originalDispatch(action);
}
return store;
};
增强器通常都使用这样的模式,将store上某个函数的引用存下来,给这个函数一个新的实现,但是在完成增强功能之后,还是要调用原有的函数,保持原有的功能。在上例中,我们想要增强dispatch函数,先把store.dispatch的实现存在originalDispatch变量中,这样在新的dispatch函数中就可以调用,保证不破坏Redux Store的默认功能了。
增强器还可以给Store对象增加新的函数,下面我们就举一个这样的例子。 深入浅出React和Redux