如何在 reducer 之间共享 state?

前端精髓

共 1164字,需浏览 3分钟

 ·

2021-03-29 12:43


许多用户想在 reducer 之间共享数据,但是 combineReducers 不允许此种行为。有许多可用的办法,今天就一起讨论这个问题。


combineReducers(reducers)


reducers (Object): 一个对象,它的值(value)对应不同的 reducer 函数,这些 reducer 函数后面会被合并成一个。


随着应用变得越来越复杂,可以考虑将 reducer 函数拆分成多个单独的函数,拆分后的每个函数负责独立管理 state 的一部分。


rootReducer = combineReducers({potato: potatoReducer, tomato: tomatoReducer})// rootReducer 将返回如下的 state 对象{  potato: {    // 由 potatoReducer 管理的 state 对象 ...  },  tomato: {    // 由 tomatoReducer 管理的 state 对象 ...  }}


那么问题来了,将 reducer 函数拆分成多个单独的函数,reducer 之间无法共享 state 怎么办呢?(由 potatoReducer 管理的 state 对象与由 tomatoReducer 管理的 state 对象,无法获取对方的 state 值)。首先最简单的办法是不要将 reducer 函数拆分成多个单独的函数,而是只使用一个 reducer 函数,就不会出现这个问题了。


标准的做法是使用 Redux Thunk 中间件。要引入 redux-thunk 这个专门的库才能使用。在 redux-thunk 的异步 action 创建函数能通过 getState() 方法获取所有的 state。


export function fetchPostsIfNeeded(subreddit) {  // 注意这个函数也接收了 getState() 方法  // 它让你选择接下来 dispatch 什么。
return (dispatch, getState) => { // todo... }}


只需牢记 reducer 仅仅是函数,可以随心所欲的进行划分和组合,而且也推荐将其分解成更小、可复用的函数。


总结:如果一个 reducer 想获取其它 state 层的数据,往往意味着 state 树需要重构,需要让单独的 reducer 处理更多的数据。

浏览 23
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报