React Redux“在调度内检测到状态突变”错误

问题描述 投票:0回答:1

我正在尝试使用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 函数返回的值也经常被传递。但是,只有保存到状态时才会出现问题。

javascript reactjs redux react-redux redux-toolkit
1个回答
0
投票

你正在改变这里的状态:

obj[originChannel]["members"] = members

...还有这里:

obj[changed_channel].members[sender.socketId] = sender;

您只是创建了浅副本,而不是深副本,所以即使

obj !== state.channels
是真的,我们仍然有
obj.something === state.channels.something

© www.soinside.com 2019 - 2024. All rights reserved.