在我在redux中看到的示例中,动作对象似乎总是包含我们正在创建/编辑的状态的属性,而不是直接传入对象。例如
/* 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”对象,并在还原器中添加缺少的元素?
我正在开发一个应用程序,在这个应用程序中,被传递的对象有很多属性,我发现我必须重复从每个还原器函数中的动作中提取这些属性。例如,在前面的示例中,是否更容易将action.todo设置为相关对象,并且还原器只添加缺少的任何属性(例如id)?
这是我未能掌握的某种惯例/模式吗?
发布于 2015-12-28 22:04:11
一般来说,我认为你的行为应该尽可能简单,只传达他们所需要的最少数量的信息。但是,您当然可以将操作的结构更改为更便于处理的格式。一个常见的模式是使用payload键指向所有数据。例如:
/* 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
];您的有效载荷构成了todo对象的基础。不是提取几个属性,而是只提取一个属性。
发布于 2020-09-28 11:59:13
这是一个旧的职位,但仍然值得额外的答案。我也是来自OO编程的世界,我也偶然发现了这一点:
通常建议您将json传递给redux操作,而不是由它生成的对象,因为它允许具有更舒适的调试和测试功能。对于这两种情况,您都需要序列化您的“数据”,如果该数据是对象/实例等,则不能完全序列化。这与传递的对象的属性或配置是相反的。这是一种不同的看法,如何完成的事情,真的很好的好处。
注意仔细的措辞--我不能说你不应该传递一个实例,也不能说不传递一个实例更好。但这是今天的常识,首选的方式。
https://stackoverflow.com/questions/34501035
复制相似问题