我有一个reducer,它首先得到一个没有book copies count属性的books数组对象列表,而且每本书得到的副本数量
const bookList= (state = [], action) => {
switch (action.type) {
case 'BOOKS_REQUEST_SUCCEEDED':
return Object.assign({}, state, action.payload);
case 'BOOKS_COUNT_REQUEST_SUCCEEDED':
return updateBookCopiesCount(state, action);
default:
return state
}
}
const updateBookCopiesCount = (state, action) => {
const newState = state.map((book) => { // updating only the book copies count
if (book.Id === action.payload.Id) {
return { ...book,
copiesCount: action.payload.copiesCount
};
}
return book;
});
return newState;
}
我的问题是,什么是正确的redux方法: 我应该每次复制整个数组以及每个copiesCount更新的所有对象,还是只复制使用新属性修改的对象
提前致谢
答案 0 :(得分:1)
如果数据发生任何变化,Redux仅要求您必须返回新的值实例,即它强制实现不变性。 并且它不会强制执行减速器的特定形式。 所以,你的问题实际上并不是关于redux方法,而是关于一般javascript任务如何以不可变的方式执行数据转换。
从我的观点来看,你的代码对于这个特定任务来说绝对正常。
答案 1 :(得分:0)
当前updateBookCopiesCount
功能正确无误。您需要复制需要更新的每个嵌套级别,但仅需要更新的内容。因此,您需要复制state
(通过state.map()
进行复制,并且您需要复制只是需要更新的数组中的一个对象。其他对象应按原样返回。
有关详细信息,请参阅Redux文档的Structuring Reducers - Immutable Update Patterns部分。