考虑以下状态:
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,
}
如何更新posts
数组中ÌDs
数组中的bookmarks
数组?我试过这个:
case 'SET_USER_BOOKMARKED_POSTS':
return {
...state,
bookmarks: {
IDs: {
posts: action.payload
}
}
}
但是当我将状态记录到控制台时,IDs
数组只包含posts
,而opps
和news
数组不再存在。
答案 0 :(得分:2)
您还需要使用state.bookmarks.IDs
的扩展运算符,因为当在扩展运算符之后指定键时,键的值将被覆盖。
case 'SET_USER_BOOKMARKED_POSTS':
return {
...state,
bookmarks: {
...state.bookmarks
IDs: {
...state.bookmarks.IDs,
posts: action.payload
},
}
}
答案 1 :(得分:2)
你需要破坏所有内部结构:
case 'SET_USER_BOOKMARKED_POSTS':
return {
...state,
bookmarks: {
...state.bookmarks,
IDs: {
...state.bookmarks.IDs,
posts: action.payload
}
}
}
但这不是很方便,更好地使用lodash merge
答案 2 :(得分:0)
我们这样做的方法是使用Object.assign
基本指向和更新redux状态字段的非变异方法。类似的东西:
return Object.assign({}, state.bookmarks, {
IDs: action.payload,
});
这将确保您不会改变状态,并返回新的书签。如果您愿意,可以调整此选项以返回整个州,这取决于您是否需要更新中的其他数据。