在React中,我们当有大量数据需要管理我们理所应当的想到使用redux来管理我们的数据。但是一个项目中肯定是不只有一个reducer的,而很可能每个页面都有一个自己的reducer,而怎么将这些子reducer整合到一个reducer中呢。这个时候就需要用到 combineReducers 函数了。
使用方法很简单,只需要将子reducer导入,并且从redux-immutable库中引入combineReducers函数,combineReducers函数接收一个对象,这个对象就是子reducer以及它的key,将所有子reducer传入后,再将整个reducer导出即可。
在combineReducers函数的核心就是根据我们传入的action来判断当前的state有没有发生改变,如果发生了改变就返回新的state,如果没改变就用原来的state。
接下来看看combineReducers函数的内部是怎么操作的
首先是拿到传入的所有reducer的key,并且遍历所有的key,当这个key的值是一个函数时才把值放到finalReducers中,然后将所有的key存放在finalReducerKeys中。
然后返回combination函数,这个函数就是真正调用combineReducers函数的核心。
在这个函数中,首先定义了一个hasChanged来识别数据是否发生改变。然后定义个空对象nextState来存放新的state,再通过遍历上面拿到的finalReducerKeys进行进一步的操作,拿到遍历的key、reducer、previousStateForKey就是原来传进来的state。
然后将原来的值state跟action传给reducer,reducer就是我们传入的函数,返回给nextStateForKey。如果 nextStateForKey值为undefined则回抛出异常。
随后将nextStateForKey保存到nextState的key属性中,然后判断hasChanged的值,如果新的nextStateForKey不等于原来的previousStateForKey的值,就返回新的state,也就是nextState,如果相等则返回原来的state
总结:combineReducers函数就是将我们传入的reducers合并到一个对象中,最终返回一个combination的函数,其实就是根据传入的action来判断当前的state有没有发生改变,如果发生改变则返回改变了的新state,如果没发生改变则返回原来的state。新的state会触发订阅者发生对应的刷新,而旧的state可以有效的组织订阅者发生刷新。