You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redux dispatch间检测到state突变报错,求代码问题排查

问题根源

你触发Redux状态突变警告的核心原因是直接修改了Redux reducer引用的初始状态对象,具体问题出在Home.tsx的两处逻辑:

  1. 浅拷贝不彻底
    你用const updatedNotificationsstate = { ...notifInitState };做的是第一层浅拷贝,拷贝后的对象里的adhans、reminders属性仍然和reducer里导出的initialState共用同一个对象引用。你后续直接执行updatedNotificationsstate.adhans[key] = JSON.parse(value),本质是直接修改了Redux初始状态里的adhans对象,属于在reducer之外修改state的违规操作。
  2. 状态变量作用域错误
    updatedNotificationsstate定义在组件外层的全局作用域,只会在模块加载时初始化一次,后续组件重新挂载时都会复用已经被修改过的对象,会导致逻辑异常。

修复方案

把状态构造逻辑移到RestoreState函数内部,并且对嵌套对象也做拷贝,避免直接修改原初始状态:

const Home = ({ navigation }) => {
  const dispatch = useAppDispatch();
  const adhanKeys = Object.keys(notifInitState.adhans);
  // 组件挂载时恢复redux state
  React.useEffect(() => {
    const RestoreState = async () => {
      // 1. 在函数内部初始化新的状态对象,嵌套对象也做浅拷贝
      const updatedNotificationsstate = { 
        ...notifInitState, 
        adhans: {...notifInitState.adhans},
        reminders: {...notifInitState.reminders}
      };
      const savedState = await AsyncStorage.multiGet(keysArray);
      
      savedState.forEach(([key, value]) => {
        if(value){
          //通知相关
          if (adhanKeys.includes(key)) {
            // 2. 现在修改的是拷贝后的新对象,不会触碰原初始状态
            updatedNotificationsstate.adhans[key] = JSON.parse(value);
          }
          // 其他属性修改同理,涉及嵌套对象的要保证用的是拷贝后的新对象
        }
      });

      dispatch({
        type: actionTypes.RESTORE_NOTIFICATIONS,
        payload: updatedNotificationsstate,
      });
    };
    RestoreState();
  }, []);
  // 其余逻辑不变
}

另外你reducer里RESTORE_NOTIFICATIONS的处理逻辑可以保持不变,因为传入的payload已经是全新的状态对象,不会产生突变问题。

内容的提问来源于stack exchange,提问作者Basit Minhas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:45:04