是否可以使用setState
更新对象的属性
比如:
this.state={
贾斯珀:{姓名:“贾斯珀”,年龄:28},
}
我试过:
this.setState({jasper.name:'someOtherName'});
这是:
this.setState({jasper:{name:'someothername'})
第一个导致语法错误,第二个什么也不做。有什么想法吗
有多种方法可以做到这一点,因为状态更新是一个异步操作,所以要更新状态对象,我们需要使用带有setState
的updater函数
1-最简单的一个:
首先创建一份jasper的副本,然后进行以下更改:
此.setState(prevState=>{
让jasper=Object.assign({},prevState.jasper);//创建状态变量jasper的副本
jasper.name='someothername';//更新name属性,分配一个新值
return{jasper};//返回新对象jasper对象
})
我们也可以这样编写,而不是使用Object.assign
:
让jasper={…prevState.jasper};
2-使用扩展语法:
此.setState(prevState=>({
jasper:{//我们要更新的对象
…prevState.jasper,//保留所有其他键值对
name:'something'//更新特定键的值
}
}))
注意:对象。分配
和扩展运算符
只创建浅层副本,因此如果定义了嵌套对象或对象数组,则需要不同的方法
正在更新嵌套状态对象:
假设您已将状态定义为:
this.state={
食物:{
三明治:{
辣椒:没错,
饼干:是的,
蛋黄酱:没错
},
比萨饼:{
墨西哥胡椒:是的,
课外活动:错误
}
}
}
要更新pizza对象的附加表,请执行以下操作:
此.setState(prevState=>({
食物:{
…prevState.food,//复制food对象的所有其他键值对
比萨饼:{//食物对象的特定对象
…prevState.food.pizza,//复制所有pizza键值对
extraCheese:true//更新特定键的值
}
}
}))
正在更新对象数组:
假设您有一个todo应用程序,并且您正在以以下形式管理数据:
this.state={
待办事项:[
{
名称:“学习反应基础”,
状态:“待定”
}, {
名称:“检查代码库”,
状态:“待定”
}
]
}
要更新任何todo对象的状态,请在数组上运行映射并检查每个对象的某些唯一值,如果条件=true
,则返回具有更新值的新对象,否则返回相同对象
让键=2;
this.setState(prevState=>({
todoItems:prevState.todoItems.map(
el=>;el.key===key?{…el,状态:'done'}:el
)
}))
建议:如果对象没有唯一值,则使用数组索引