Redux dispatch间检测到state突变报错,求代码问题排查
问题根源
你触发Redux状态突变警告的核心原因是直接修改了Redux reducer引用的初始状态对象,具体问题出在Home.tsx的两处逻辑:
- 浅拷贝不彻底
你用const updatedNotificationsstate = { ...notifInitState };做的是第一层浅拷贝,拷贝后的对象里的adhans、reminders属性仍然和reducer里导出的initialState共用同一个对象引用。你后续直接执行updatedNotificationsstate.adhans[key] = JSON.parse(value),本质是直接修改了Redux初始状态里的adhans对象,属于在reducer之外修改state的违规操作。 - 状态变量作用域错误
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
相关产品推荐
相关产品推荐

