reactjs - 为 Redux 状态中的对象中的每个项目更新单个值
问题描述
我在 redux 状态中有一个通知列表。正如你在下面看到的。
列表中可能有更多项目,我的目标是根据isRead
值为true
列表中的所有项目设置isDiscussionType
值。我在减速器中使用以下代码:
case MARKALLASREAD_NOTIFICATIONS_SUCCESS:
return {
...state,
loading: false,
notifications:
Object.keys(state.notifications).map(id => {
if (state.notifications[id].isDiscussionType == action.payload.isDiscussionType)
return { ...state.notifications[id], isRead: true }
else
return { ...state.notifications[id] }
})
};
此代码导致以下状态,其中key
丢失(设置为 0),并且isRead
值未更改(尽管数据库已正确更新)。
你看到我上面分享的代码有什么问题吗?
解决方案
Map 返回一个数组而不是一个对象。这就是为什么你会丢失你的 id,因为 0 只是数组中的索引,现在在通知下。我会将通知的生成移出返回以获得更大的灵活性:
case MARKALLASREAD_NOTIFICATIONS_SUCCESS:
const notifications = { ...state.notifications }
Object.values(notifications).forEach(notification => {
if(notification.isDiscussionType === action.payload.isDiscussionType) {
notifications[notification.id] { ...notification, isRead: true }
}
}
return {
...state,
loading: false,
notifications
};
如果 isDiscussionType 相同,这将返回每个通知更改的不可变对象。因为map、filter、reduce返回数组,我会把它移出返回并使用forEach。
希望这可以帮助。快乐编码。
推荐阅读
- linux - 我需要安装什么才能使用 fwupd 更新我的计算机固件?
- mysql - 如何在单个查询mysql中选择多个表?(有些表还没有数据)
- jquery - 如何使用数据表中的引导模型在弹出窗口中打开数据
- python - ModuleNotFoundError:没有名为“PyDIP”的模块,尽管它已安装
- light-4j - 如何为 Docker 创建 light-4j fatjar
- c# - asp核心发布API路由问题
- sharepoint - Sitecore CMS 迁移到 Sharepoint
- apache-spark - 无法在 Spark 中读取 ORC 事务表。看到空的数据框
- python - 如何比较for循环中的值
- javascript - 侧页敲除导致您不能多次将绑定应用于同一元素