Javascript 如何在Redux状态的嵌套数组中只更新一个值?

Javascript 如何在Redux状态的嵌套数组中只更新一个值?,javascript,redux,Javascript,Redux,考虑以下国家: const initState = { id: { data: null, isFetching: false, fetchingError: null }, bookmarks: { IDs: { news: [], opps: [], posts: [] },

考虑以下国家:

const initState = {
    id: {
        data: null, 
        isFetching: false, 
        fetchingError: null
    },  
    bookmarks: {
        IDs: {
            news: [], 
            opps: [],
            posts: []           
        },
        data: {
            news: [], 
            opps: [],
            posts: []
        },      
        isFetching: false, 
        fetchingError: null
    },
    role: null,
    membership: null,   
}
如何仅更新
书签
数组中
ÌDs
数组中的
posts
数组?我试过这个:

case 'SET_USER_BOOKMARKED_POSTS':
    return {
        ...state, 
        bookmarks: {
            IDs: {
                posts: action.payload
            }
        }
    }

但是当我将状态记录到控制台时,
IDs
数组只包含
posts
,而
opp
news
数组不再存在。

您需要对
状态使用扩展操作符。bookmarks.IDs
也与在扩展操作符之后指定键一样,这些键的值将被覆盖

case 'SET_USER_BOOKMARKED_POSTS':
return {
    ...state, 
    bookmarks: {
        ...state.bookmarks
        IDs: {
            ...state.bookmarks.IDs,
            posts: action.payload
        },   
    }
}

您需要为state.bookmarks.IDs使用扩展运算符,因为在扩展运算符之后指定键时,键的值将被覆盖

case 'SET_USER_BOOKMARKED_POSTS':
return {
    ...state, 
    bookmarks: {
        ...state.bookmarks
        IDs: {
            ...state.bookmarks.IDs,
            posts: action.payload
        },   
    }
}

您需要破坏所有内部结构:

case 'SET_USER_BOOKMARKED_POSTS':
    return {
        ...state, 
        bookmarks: {
            ...state.bookmarks,
            IDs: {
                ...state.bookmarks.IDs,
                posts: action.payload
            }
        }
    }

但这不是很方便,最好使用

您需要破坏所有内部结构:

case 'SET_USER_BOOKMARKED_POSTS':
    return {
        ...state, 
        bookmarks: {
            ...state.bookmarks,
            IDs: {
                ...state.bookmarks.IDs,
                posts: action.payload
            }
        }
    }

但这不是很方便,最好使用我们使用
对象的非变异方法。分配
基本上指向并更新处于redux状态的字段。比如:

return Object.assign({}, state.bookmarks, {
    IDs: action.payload,
});

这将确保您没有改变状态,并返回新书签。如果愿意,您可以调整此选项以返回整个状态,这取决于您是否需要更新中的其他数据。

我们这样做的方式是使用
对象的非变异方法。分配
以基本上指向并更新处于redux状态的字段。比如:

return Object.assign({}, state.bookmarks, {
    IDs: action.payload,
});
这将确保您没有改变状态,并返回新书签。如果愿意,您可以调整它以返回整个状态,这取决于您是否需要更新中的其他数据