reactjs - 如何在 useReducer 中更新键索引数组状态?
问题描述
我的状态模型如下
export interface State {
[key: string]: UnitState;
}
所以 State 持有所有单位的状态,键为 unitID。所以理想情况下应该是这样的
{ 'ABC': {unitName: 'John', unitOpen: 'true'},
'XYZ': {unitName: 'Peter', unitOpen: 'false'}
}
现在,当我想在 reducer 中进行一些状态更新时,我该怎么做?我尝试过这样的事情,但没有奏效。我在这里查看了其他帖子,但没有一个有键索引数组的示例
case 'UPDATE_UNIT_NAME': {
const stateCopy = Object.assign({}, state);
const name = action.name;
stateCopy[unitId] = { ...stateCopy[unitId], unitName: name};
return {...state, stateCopy};
}
解决方案
问题
- 你的状态不是一个数组,它是一个对象。
- 您正在复制您的状态,但随后您将更新后的状态嵌套在一个
stateCopy
属性下的下一个状态对象中,我猜这不是您想要的结果。
解决方案
浅复制状态以及任何正在更新的嵌套属性。
case 'UPDATE_UNIT_NAME': {
const { name } = action;
return {
...state, // <-- shallow copy state object
[unitId]: {
...state[unitId], // <-- shallow copy nested unit object
unitName: name // <-- update specific property
},
};
}
推荐阅读
- performance - Postman 桌面应用程序在 Windows 10 上运行缓慢
- hive - 使用具有高基数的列键的 Hive 分区
- javascript - JavaScript onClick 函数无法正常工作
- visual-studio - 如何在 VS2019 的开发人员命令提示符中修复此链接器错误
- qt - 为什么 Qt Quick Application 无法通过方法 Qt.createComponent 动态创建控件
- spring-boot - Spring Boot - Liquibase - WebSphere - 无法为 url 文件 xxx/jsf-nls.jar 创建文件系统
- java - Firestore 查询数组
- flutter - Flutter 发布版启动器图标
- cassandra - Cassandra 时间窗口压缩与时间序列数据的存储桶键
- python - 如何确保 PyTorch 已释放 GPU 内存?