是否可以在Redux存储中具有多个状态,并由组合归约器分别处理?

时间:2019-03-28 16:58:21

标签: react-redux

我正在查看React-Redux应用程序中的一些代码,发现在Redux存储中存在三个状态,并且对每个状态的更改是由不同的reducer(组合reducer)处理的。类似于以下内容:

src / models

--model1
--model2
--model3

src / reducers / index.js

const rootReducer = combineReducers({
  model1Reducer,
  model2Reduce,
  model3Reducer
 })

src / reducers / model1Reducer

// import model1 here
const model1Reducer = (state = model1, action) { }

类似地,model2Reducer和model3Reducer分别导入model2和model3并对其执行操作。

在Redux中定义三种不同状态树的方法可以吗? Redux的原则之一是真理的单一来源。那好吗?

2 个答案:

答案 0 :(得分:0)

您在此描述的是使用redux的正确方法,与我们在组织中使用的方法相同。

“单一真理”原则背后的含义是

  

轻松创建通用应用程序,因为服务器的状态可以序列化   无需额外的编码工作即可将其添加到客户中。

我们使用combinedReducers通过逻辑将应用程序的一部分分开,并避免了reducer在更新商店方面变得复杂的情况。这并不意味着这样做会将商店分为不相关的状态。它们每个都管理商店的独立部分。它“只是”使我们的代码在维护方面更具可读性和模块化。

这是Redux文档的一部分,解释了combinedReducers

的概念
  

随着您的应用程序变得越来越复杂,您需要拆分减少   将功能分为不同的功能,每个功能管理   状态。

     

combinedReducers帮助器函数可将其值为   可以将不同的归约函数合并为一个归约函数   传递给createStore。

     

生成的reducer调用每个子级的reducer,并收集它们的   结果成为一个状态对象。

答案 1 :(得分:0)

以下是减速器的规则:

  1. 除“ undefined”外,还必须返回任何值。
  2. 仅使用以前的状态和操作来产生要在您的应用内部使用的“状态”或数据。
  3. 一定不能超越自身来决定返回什么值。
  4. 不得更改其输入状态参数。

您的getResources()如下所示:

combineReducers

您的特定减速器将如下所示:

export default combineReducers({
  property1: model1Reducer,
  property2: model2Reduce,
  property3: model3Reducer
}

现在,我上面没有显示的是ES2015语法(export default () => { return 123; } ),您可以在其中执行以下操作:

selectedSong = null

这遵循规则1,在该规则中,我们必须返回const selectedSongReducer = (selectedSong = null, action) => { if (action.type === 'SELECTED_SONG') { return action.payload; } return selectedSong; } 以外的任何值,因为如果不这样做,则在应用程序启动时我们将得到未定义的值,因此我们实现了ES6 / ES2015中的默认参数值。

它不一定要默认为undefined,它可以是一个空数组,字符串或对象,具体取决于减速器的上下文。

第二次调用化径器将不再是null,第一个参数将是上次运行时返回的值。

reducer调用时唯一改变的是操作对象。