Redux:通用更新操作

时间:2017-07-06 13:49:38

标签: redux react-redux

我正在使用Redux,我的状态是一个标准化的,有很多不同的模型。现在我想知道自己是否有更好的具体行动,如:

{type: CHANGE_MODEL_NAME, modelId, name}

VS

{type: UPDATE_MODEL, modelId, {name}}

我做了一些搜索,我发现了这个问题:

Is it ok to create generic redux update action

现在我想知道的是,没有人认为具有特定的行动类型允许不同的减速器做出反应。以更清洁的方式采取行动。

IE:我有一个从另一个模型复制的模型,如下所示:

{
  name: 'foo',
  originalModel: id_0
}

如果我只想对名称更改操作做出反应,那么对复制模型的reducer中的特定操作做出反应会变得更容易。

2个减速器对同样的动作做出反应是不对的?这就是为什么没有人在原问题中解决这个问题?

2 个答案:

答案 0 :(得分:1)

让多个切片缩减器响应相同的操作绝对是Redux的预期用例。我在帖子The Tao of Redux, Part 1 - Implementation and Intent中介绍了该背景。

至于您的具体问题:我认为对包含项目类型名称和项目ID的规范化数据进行更新操作是完全有效的。事实上,我在帖子Practical Redux, Part 7: Form Change Handling, Data Editing, and Feature Reducers中展示了这种确切的方法。

总体而言,Redux本身并不关心您拥有的具体操作类型以及它们的通用性。我们鼓励您定义适合您的应用的任何操作,以及它们所代表的“抽象”级别。让它们更通用是非常合理的 - 例如,我更喜欢UPDATE_USER_ATTRIBUTES而不是SET_USER_FIRST_NAMESET_USER_LAST_NAME,但最终取决于你。

答案 1 :(得分:1)

这完全有效。这种模式甚至有一个名字。 “应用更改集”

您的消息将变为以下内容:

{type: APPLY_CHANGSET, data: {id: idOfThingToApplyTo, propOne: '1', propTwo: '2'}}

你的减速器可以是这样的:

const propOneReducer = (value = 'default', {type, {data: {propOne}}) => {
  return type === APPLY_CHANGSET && propOne !== undefined ? propOne : value;
}

这使得向商店中的对象添加新属性(属性)变得更加容易。添加reducer,并将您的react视图中的数据发送到actionCreator。在简单的情况下,您甚至可能不需要更改actionCreator。

在这些简单的情况下,您甚至可以构建一个reducer创建器,基本上为您创建reducer。

Pro的

  • 系统中较少的操作
  • 简单的甜蜜行动传感器

Not Pro's

  • 行动并未准确描述正在发生的事情。在调用actionCreator之后,更难以准确地解析商店发生的事情。这是因为减速器现在考虑了数据的形状。
  • 稍微复杂的减速器