javascript - map() 作为 setState() 中的回调在 React 中奇怪地运行条件两次
问题描述
我正在将一组对象加载到组件的状态中。这是数组的内容
const toDoData = [
{
id:1,
task:"Take out trash",
completed : false
},
{
id:2,
task:"Wash the dishes",
completed : true
},
{
id:3,
task:"Do groceries",
completed : false
},
我将其加载到以下状态;
this.state={
data:toDoData
}
我想通过单击一个按钮来更改 object.completed 的布尔值,我通过以下方式更新状态来做到这一点;
changeStatus(id){
this.setState(prev=>{
const updatedtodo=prev.todo.map(todo=>{
if(todo.id==id){
todo.completed = ! todo.completed
console.log(todo.completed)
}
return todo
})
return{
todo:updatedtodo
}
})
}
但是由于某种原因,其中的条件语句最终运行了两次(console.log 语句显示两次),这将布尔值设置回其原始值。有人可以启发我为什么会这样吗?以及如何解决这个问题?提前致谢
解决方案
changeStatus(id){
this.setState(prev=>{
const clonePrev = {...prev};
const updatedtodo=clonePrev.todo.map(todo=>{
if(todo.id==id){
todo.completed = ! todo.completed
console.log(todo.completed)
}
return todo
})
return{
todo:updatedtodo
}
})
}
推荐阅读
- javascript - Javascript 循环承诺与附加参数同步
- php - 正则表达式的问题
- android - mapbox 导航 ondidfinishloadingstyle 异常
- qt - 连接特定信号和插槽一次,然后断开它们
- c# - 如何使用多个参数对对象列表执行搜索?
- python - Pytorch 参数()在收集到列表或保存在生成器中时表现不同
- python - PyTorch:在没有 CPU 传输的情况下渲染点云?
- casting - 在 Power BI 中将字符串列转换为 int
- javascript - CalendarList:列表不返回日历列表
- php - 查询内容最多的前 5 个类别,每个类别返回 5 个内容,并使用 laravel 将 associaled 用户名与内容连接起来