【问题标题】:Redux: Generic update actionRedux:通用更新操作
【发布时间】:2023-03-18 02:07:02
【问题描述】:

我正在使用 Redux,我的状态是具有许多不同模型的标准化状态。现在我想知道自己是否最好采取以下具体行动:

{type: CHANGE_MODEL_NAME, modelId, name}

{type: UPDATE_MODEL, modelId, {name}}

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

Is it ok to create generic redux update action

现在我想知道的是,没有人关注这样一个事实,即具有特定的动作类型允许不同的减速器以更清洁的方式对动作做出“反应”。

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

{
  name: 'foo',
  originalModel: id_0
}

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

2 个 reducer 对相同的动作做出反应是错误的吗?这就是为什么没有人在原始问题中解决这个问题的原因吗?

【问题讨论】:

    标签: redux react-redux


    【解决方案1】:

    让多个 slice reducer 响应相同的操作绝对是 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,但最终取决于你。

    【讨论】:

    • 谢谢,我会阅读这些帖子。我发现 Redux 更难的一件事是所有示例都是针对 webapp 的,它们非常简单,甚至不需要 Redux。当您发展到具有大量可能的用户操作的更复杂和嵌套的数据时,就不太清楚什么是好的做法,什么不是,
    • 是的,对于图书馆文档来说,总是很难在“保持简单,这样我们就可以教授图书馆的原则”与“这就是它在现实世界中的使用方式”之间进行权衡。这就是为什么我一直在写我的两个主要博客文章系列,以帮助涵盖那些“现实世界”的问题和用法。此外,有关更多文章和示例,请参阅我的链接列表的 Redux ArchitectureRedux Techniques 部分。
    • 我浏览了你的博客,稍后我会更彻底地阅读它,但我想在一些事情上让你的大脑思考一下。假设您想创建一个可以独立存在的模型,但您想同时将此模型的 id 添加到其他地方。您将在哪里生成该 ID,以便第二个操作(添加该 ID 的操作)可以检索新 ID。
    • 任何随机值的生成都应该在动作创建者端完成。我的“Practical Redux”系列还没有展示创建示例——我希望最终能做到这一点。但是,有关随机性的示例,请参阅 Roll the Dice: Random Numbers in ReduxRandom in Redux
    • 恐怕我现在没有时间进一步讨论这个问题。但是,我今晚会像往常一样在 Reactiflux 聊天频道在线。请随时联系我或询问其他人。邀请链接在reactiflux.com
    【解决方案2】:

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

    您的消息变成以下内容:

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

    你的 reducer 可以如下所示:

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

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

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

    专业的

    • 系统中的操作更少
    • 简单甜蜜的动作创作者

    不是专业的

    • 操作不能准确描述正在发生的事情。在调用 actionCreator 后,也更难准确解析商店发生的情况。这是因为 reducer 现在会考虑数据的形状。
    • 稍微复杂的减速器

    【讨论】:

      猜你喜欢
      • 2020-08-26
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 2019-08-18
      • 2018-04-08
      • 2021-03-29
      • 2019-12-04
      • 1970-01-01
      相关资源
      最近更新 更多