在我在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)?
这是某种我未能掌握的惯例/模式吗?
答案 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动作,而不是传递给它的对象,因为它可以具有更舒适的调试和测试功能。对于这两者,您都需要序列化“数据”,并且如果此数据是对象/实例等,则无法完全序列化。这与传递的对象的单纯属性或配置相反。 对于如何完成事情有不同的看法,确实有很多好处。
请注意措辞-我不能说您不应该传递实例,也不可以不传递实例。但这是今天的常识,首选方式。