reactjs - 反应状态正在更新而不调用 setState
问题描述
即使我创建了新变量并且没有调用 setState,我的状态也发生了变化。
这是我的代码
changeName = (event, id) => {
const persons = [...this.state.persons]; // Create a copy of array using spread operator
const person = persons.find(cur => cur.id === id);
person.name = event.target.value;
console.log(persons);
console.log(this.state.persons);
}
render() {
let allPersonsArr = this.state.persons.map(cur => {
return <Person name={cur.name} age={cur.age} job={cur.job} key={cur.id} change={(event) => this.changeName(event, cur.id)}/>;
});
return(
<div>
{allPersonsArr}
</div>
);
}
state.persons 在使用后检查到控制台时发生了变化,person.name = event.target.value
即使我指向新的数组people
解决方案
扩展语法只创建数组的一级深层副本,而不是深层副本,并且由于数组中有对象,因此设置person.name
会更改原始对象
changeName = (event, id) => {
const persons = this.state.persons(person => {
if (person.id === id) {
return {...person, name: event.target.value}
}
return persons;
})
this.setState({ persons })
}
推荐阅读
- jestjs - React 测试库清理在 Jest 的描述块中不起作用
- python-2.7 - 为什么 ForEach 接收器在 Spark 结构化流中不调用函数 (show_data_function)?
- ubuntu - Netplan:在 Ubuntu 18.04 上配置故障转移 IP
- python - 多维字符串数组
- go - 这个赋值给无类型空白标识符有什么影响?
- python - Docker-compose/Nginx/Gunicorn - Nginx 不工作
- c# - 按名称 C# 对对象属性列表进行排序
- reactjs - GraphQL 和 Apollo - 多重突变
- c# - MS Graph SDK C# - 获取计划内的所有任务
- c - 如何检测我的哪一段代码正在生成“致命错误:glibc 检测到无效的 stdio 句柄”错误?