在redux reducer中如何更新数组对象内的1个属性

时间:2017-07-26 08:40:54

标签: javascript reactjs redux react-redux immutability

我有一个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更新的所有对象,还是只复制使用新属性修改的对象

提前致谢

2 个答案:

答案 0 :(得分:1)

如果数据发生任何变化,Redux仅要求您必须返回新的值实例,即它强制实现不变性。 并且它不会强制执行减速器的特定形式。 所以,你的问题实际上并不是关于redux方法,而是关于一般javascript任务如何以不可变的方式执行数据转换。

从我的观点来看,你的代码对于这个特定任务来说绝对正常。

答案 1 :(得分:0)

当前updateBookCopiesCount功能正确无误。您需要复制需要更新的每个嵌套级别,但需要更新的内容。因此,您需要复制state(通过state.map()进行复制,并且您需要复制只是需要更新的数组中的一个对象。其他对象应按原样返回。

有关详细信息,请参阅Redux文档的Structuring Reducers - Immutable Update Patterns部分。