在行动中传递对象与属性

时间:2015-12-28 21:29:33

标签: reactjs redux

在我在redux repo中看到的示例中,似乎操作对象始终包含我们正在创建/编辑的状态的属性,而不是直接传入对象。例如

/* In the action creator */
export function addTodo(text) {
  return { type: types.ADD_TODO, text }
}

/* In the reducer */
....
case ADD_TODO:
  return [
    {
      id: state.reduce((maxId, todo) => Math.max(todo.id, maxId), -1) + 1,
      completed: false,
      text: action.text
    }, 
    ...state
  ]

这样做是否有任何特别的优势,而不是传递一个' todo'直接在动作中对象并在reducer中添加任何缺少的元素?

我正在开发一个应用程序,其中传入的对象具有许多属性,我发现我必须从每个reducer函数中的操作重复提取这些属性。在上一个示例中,更容易拥有,将action.todo设置为相关对象,并且reducer只添加缺少的任何属性(例如id)?

这是某种我未能掌握的惯例/模式吗?

3 个答案:

答案 0 :(得分:2)

老实说,我建议这种设计决定“取决于你”,就像你正在寻找的代码的设计者一样。几乎在每种情况下,一种方法与其他方法相比没有分类优势。

如果您发现,在您的情况下,您正在“重复自己”,特别是如果您发现“无关”位似乎在“每个”减速器功能中显示,那么我建议您应该关注本能。您看到在用作模型的代码中使用的策略可能非常 适用于您的案例,您应该感到完全有权制作工程决定。

换句话说:恕我直言,从工程的角度来看,我当然不希望看到任何“在每种情况下重复”,除非真的属于 “每个案例”,因为否则夫妻多个(否则就是“无关”)案件在一起!

思考: “如果将来需要做出这样的改变会怎么样?这种改变会”适当地隔离“,还是会”涟漪“ “整个源代码Universe就像一个地狱般的Jell-O碗,并且”没有充分的理由?“从软件工程的观点来看,这会”糟透了......“没有充分的理由。“因此,避免它是明智的。

答案 1 :(得分:1)

一般来说,我认为您的行动应该尽可能简单,只传达他们需要的最少量的信息。但是,您当然可以将操作的结构更改为更便于处理的格式。常见的模式是使用payload键指向所有数据。 e.g。

    /* In the action creator */
    export function addTodo(text, date, priority) {
      return {
        type: types.ADD_TODO,
        payload: {
          text,
          date,
          priority
        }
      };
    }

    /* In the reducer */
    case ADD_TODO:
      return [
        Object.assign({}, action.payload, {
          id: newId()
        }, 
        ...state
      ];

您的有效负载构成了待办事项对象的基础。您只需提取一个属性,而不是提取多个属性。

答案 2 :(得分:0)

它是旧帖子,但仍然值得您额外回答。我也来自OO编程领域,我也偶然发现了这一点:

通常建议您将json传递给redux动作,而不是传递给它的对象,因为它可以具有更舒适的调试和测试功能。对于这两者,您都需要序列化“数据”,并且如果此数据是对象/实例等,则无法完全序列化。这与传递的对象的单纯属性或配置相反。 对于如何完成事情有不同的看法,确实有很多好处。

请注意措辞-我不能说您不应该传递实例,也不可以不传递实例。但这是今天的常识,首选方式。

在这里再说几句话: https://redux.js.org/faq/design-decisions#why-doesnt-redux-support-using-classes-for-actions-and-reducers