React/Redux新手求教:如何在Reducer中更新对应文档状态
解决方案
首先需要明确你的state.documents是对象结构(键为文档ID)还是数组结构,两种情况的处理方式如下:
情况1:state.documents是对象结构(推荐的Redux存储方式)
如果你的文档列表是以ID为键的对象(比如{ "docId1": { id: "docId1", status: {...}, ... }, ... }),可以这样实现:
updateDocumentStatus: ( state, action: PayloadAction<{ id: any; status: any }>, ) => { const { id, status } = action.payload; // 检查目标文档是否存在 if (state.documents[id]) { // 合并原有status与新状态,避免覆盖其他状态字段 state.documents[id].status = { ...state.documents[id].status, ...status }; } },
情况2:state.documents是数组结构
如果文档列表是数组(比如[ { id: "docId1", status: {...}, ... }, ... ]),则用以下写法:
updateDocumentStatus: ( state, action: PayloadAction<{ id: any; status: any }>, ) => { const { id, status } = action.payload; // 找到对应文档的索引 const targetDocIndex = state.documents.findIndex(doc => doc.id === id); if (targetDocIndex !== -1) { // 合并状态,保留原有字段 state.documents[targetDocIndex].status = { ...state.documents[targetDocIndex].status, ...status }; } },
关键说明
- 使用
...扩展运算符合并status是为了避免直接赋值覆盖原有状态中的其他字段(比如如果以后新增hasDownloaded这类状态,不会被丢失)。 - 你的代码看起来是基于Redux Toolkit的
createSlice实现的,内部Immer允许直接修改draft state,所以上述写法是合规的。
内容的提问来源于stack exchange,提问作者Kandarp Gandhi
相关产品推荐
相关产品推荐

