我正在尝试使用价差运算符更新对象的嵌套值。这是我第一次使用它,我相信我已经接近实现最终目标,但是我似乎无法弄清楚下一步的实际工作。
我有一个结构如下的数组:
[
{
name: "Category 1",
posts: [
{
id: 1,
published: false,
category: "Category 1"
},
{
id: 2,
published: true,
category: "Category 1"
}
]
},
{
name: "Category 2",
posts: [
{
id: 3,
published: true,
category: "Category 2"
},
{
id: 4,
published: true,
category: "Category 2"
}
]
}
]
单击按钮时,我试图更新发布的值,并且在使用React时,我需要设置状态。因此,向我建议我使用点差运算符进行更新。
onPostClick(post) {
post.pubished = !post.published;
this.setState({...this.state.posts[post.category], post})
}
如果我注销{...this.state.posts[post.category], post}
的结果,则可以看到发布的内容正被添加到父表单中,形式为:
{
name: "Category 1",
published: false,
posts: [
...
]
}
显然这不是预期的结果,我希望它更新posts
对象中的实际对象。
我尝试做类似this.setState({...this.state.posts[post.category].posts, post})
的操作,但收到一条消息,提示它未定义。
答案 0 :(得分:1)
您无法使用this.state.posts[post.category]
访问数据。 posts
数据在数组对象中。
您可以进行过滤以在数组中找到类别对象并更改其发布值。
onPostClick(post) {
//CLONE YOUR DATA
var postArray = this.state.posts;
//FIND YOUR CATEGORY OBJECT IN ARRAY
var categoryIndex = postArray.findIndex(function(obj){
return obj.name === post.category;
});
//FIND YOUR POST AND CHANGE PUBLISHED VALUE
postArray[categoryIndex].posts.forEach(function(item){
if (item.id === post.id) {
item.published = !item.published;
}
});
//SET TO STATE TO RERENDER
this.setState({ posts: postArray});
}
如果您的州名为真,这应该可以工作。
答案 1 :(得分:0)
只是添加,我们知道有很多成功的方法,也许您也想尝试这种方法。
onPostClick = post => {
let published = this.state.data.map((item, i) => {
item.posts.map((item_post, i) => {
if (item_post.category === post.category) {
item_post.published = !post.published;
}
});
});
this.setState({ ...this.state.data, published });
};