使用React中的setState更新对象

是否可以使用setState更新对象的属性

比如:

this.state={
贾斯珀:{姓名:“贾斯珀”,年龄:28},
}

我试过:

this.setState({jasper.name:'someOtherName'});

这是:

this.setState({jasper:{name:'someothername'})

第一个导致语法错误,第二个什么也不做。有什么想法吗

有多种方法可以做到这一点,因为状态更新是一个异步操作,所以要更新状态对象,我们需要使用带有setState的updater函数

1-最简单的一个:

首先创建一份jasper的副本,然后进行以下更改:

此.setState(prevState=&gt{
让jasper=Object.assign({},prevState.jasper);//创建状态变量jasper的副本
jasper.name='someothername';//更新name属性,分配一个新值
return{jasper};//返回新对象jasper对象
})

我们也可以这样编写,而不是使用Object.assign

让jasper={…prevState.jasper};

2-使用扩展语法

此.setState(prevState=&gt({
jasper:{//我们要更新的对象
…prevState.jasper,//保留所有其他键值对
name:'something'//更新特定键的值
}
}))

注意:对象。分配扩展运算符只创建浅层副本,因此如果定义了嵌套对象或对象数组,则需要不同的方法


正在更新嵌套状态对象:

假设您已将状态定义为:

this.state={
食物:{
三明治:{
辣椒:没错,
饼干:是的,
蛋黄酱:没错
},
比萨饼:{
墨西哥胡椒:是的,
课外活动:错误
}
}
}

要更新pizza对象的附加表,请执行以下操作:

此.setState(prevState=&gt({
食物:{
…prevState.food,//复制food对象的所有其他键值对
比萨饼:{//食物对象的特定对象
…prevState.food.pizza,//复制所有pizza键值对
extraCheese:true//更新特定键的值
}
}
}))

正在更新对象数组:

假设您有一个todo应用程序,并且您正在以以下形式管理数据:

this.state={
待办事项:[
{
名称:“学习反应基础”,
状态:“待定”
}, {
名称:“检查代码库”,
状态:“待定”
}
]
}

要更新任何todo对象的状态,请在数组上运行映射并检查每个对象的某些唯一值,如果条件=true,则返回具有更新值的新对象,否则返回相同对象

让键=2;
this.setState(prevState=&gt({
todoItems:prevState.todoItems.map(
el=>el.key===key?{…el,状态:'done'}:el
)
}))

建议:如果对象没有唯一值,则使用数组索引

发表评论