我正在尝试使用dispatch() 更改状态。 所以我使用 (...) 运算符来复制对象并更改状态,如下所示: 顺便说一句,当事件为“user-changed-channel”时会发生错误。 没有找到原因。请帮忙。
export default function channels(state = initialState, action) {
// console.log(action);
switch (action.type) {
case SETCHANNELS: {
if (action.event === "user-changed-channel") {
// return { ...state, channels: {} };
}
const {
event,
socketId,
sender,
originChannel,
new_channels,
changed_channel,
} = action;
const obj = updateChannels({
new_channels,
event,
socketId,
sender,
originChannel,
changed_channel,
state,
});
return { ...state, channels: obj };
}
default:
return { ...state };
}
}
//updateChannels function
export function updateChannels({
event,
new_channels,
originChannel,
state,
changed_channel,
sender,
}) {
if (event === "init") {
return new_channels;
}
if (event === "user-changed-channel") {
const obj = { ...state.channels };
if (originChannel !== null && originChannel !== undefined) {
const members = { ...obj[originChannel]["members"] };
delete members[sender.socketId];
obj[originChannel]["members"] = members;
}
obj[changed_channel].members[sender.socketId] = sender;
return obj;
}
}
我以为我会使用 (...) 运算符,并且对象将被复制,保持状态不可变,然后进行修改。但是,我仅从“user-changed-channel”收到上述错误消息。 我检查了发送给dispatch()的所有值,结果也都很好。 updateChannels 函数返回的值也经常被传递。但是,只有保存到状态时才会出现问题。
你正在改变这里的状态:
obj[originChannel]["members"] = members
...还有这里:
obj[changed_channel].members[sender.socketId] = sender;
您只是创建了浅副本,而不是深副本,所以即使
obj !== state.channels
是真的,我们仍然有obj.something === state.channels.something
。