Redux嵌套状态动态键问题:聊天应用房间消息被覆盖
Fixing Redux Nested State Overwrite for Chat Messages
咱直接戳破问题核心:你在更新指定房间的消息时,没保留该房间已有的历史消息,直接用新消息覆盖了整个房间的消息对象,这才导致每个房间永远只留着最新的那一条消息。
修正后的reducer逻辑应该是这样的:
return { ...state, messages: { ...state.messages, [action.roomId]: { // 先展开该房间已有的所有消息,再追加新消息 ...state.messages[action.roomId], [action.id]: action.payload } } };
为啥这么改?
- 第一层
...state:保留整个状态树里除messages外的其他所有数据,避免无关状态被清空 - 第二层
...state.messages:保留所有房间的消息数据,防止其他房间的消息被意外覆盖 - 第三层
...state.messages[action.roomId]:这就是你之前漏掉的关键步骤!它会把当前房间已存的所有消息都展开保留,再把新的[action.id]: action.payload加进去——这样旧消息不会被冲掉,新消息也能正常追加。
小提示:如果后续嵌套状态更新越来越复杂,也可以试试用Immer这类库简化Immutable更新的写法,不用手动写这么多层扩展运算符,能大幅降低出错概率。
内容的提问来源于stack exchange,提问作者Someone Special
相关产品推荐
相关产品推荐

