首页 > 解决方案 > 为 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值未更改(尽管数据库已正确更新)。

你看到我上面分享的代码有什么问题吗?

在此处输入图像描述

标签: reactjsreduxreact-redux

解决方案


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。

希望这可以帮助。快乐编码。


推荐阅读