更新商店中的嵌套值
Update a nested value in a store
我的状态结构如下:
{ messages:
[
{ id: 1, comments: []}
]
}
而且我想在我的消息中添加一条新评论,我有消息 ID,因此我可以轻松地创建一个新状态、循环消息并添加新评论,但它似乎没有做正确的事...
感谢您的帮助。
试试这个:
var commentToAdd = { id: 1, comment: "text" };
this.setState({ messages: [...this.state.messages.map(i => i.id === commentToAdd.id ? { id: i.id, comments: [...i.comments, commentToAdd.comment] } : i) ] });
最佳做法是将状态保持在规范化的形状中,因此您可以使用 id 索引对象而不是数组,而不是将评论存储在消息中,您将只存储 id。
对于您的示例,状态将如下所示:
{
messages: {
byId: {
'1': { id: '1', comments: ['comment1'] },
...
},
allIds: ['1', ...]
},
comments: {
byId: {
'comment1': { id: 'comment1', ... },
...
},
allIds: ['comment1', ...]
}
}
在这种结构中,为了添加新评论,您必须更新 comments
部分并在 messages[id].comments
中添加新 ID...但现在更新单个评论要容易得多。
为了将对象规范化为这种形式,我建议 normalizr。
redux 文档中有关规范化状态形状的更多信息Normalizing State Shape
我的状态结构如下:
{ messages:
[
{ id: 1, comments: []}
]
}
而且我想在我的消息中添加一条新评论,我有消息 ID,因此我可以轻松地创建一个新状态、循环消息并添加新评论,但它似乎没有做正确的事...
感谢您的帮助。
试试这个:
var commentToAdd = { id: 1, comment: "text" };
this.setState({ messages: [...this.state.messages.map(i => i.id === commentToAdd.id ? { id: i.id, comments: [...i.comments, commentToAdd.comment] } : i) ] });
最佳做法是将状态保持在规范化的形状中,因此您可以使用 id 索引对象而不是数组,而不是将评论存储在消息中,您将只存储 id。 对于您的示例,状态将如下所示:
{
messages: {
byId: {
'1': { id: '1', comments: ['comment1'] },
...
},
allIds: ['1', ...]
},
comments: {
byId: {
'comment1': { id: 'comment1', ... },
...
},
allIds: ['comment1', ...]
}
}
在这种结构中,为了添加新评论,您必须更新 comments
部分并在 messages[id].comments
中添加新 ID...但现在更新单个评论要容易得多。
为了将对象规范化为这种形式,我建议 normalizr。
redux 文档中有关规范化状态形状的更多信息Normalizing State Shape