javascript - 无法使用不变性助手更新状态
问题描述
我的状态中有对象,父对象中有嵌套对象,更新状态中的对象可能会导致状态突变,并且建议使用不可变助手的许多答案,(react-addons-update)这是我的状态:
this.state = {
room: {
isOpen: false,
index: '',
roomNumber: '',
reserved: '',
isLux: null,
_id: '',
reserver:{
name: '',
surname: '',
national_id: '',
customer_number: '',
staying_til: '',
_id: ''
}
}
}
这就是更新房间属性的方式:
roomChangeEvent(e){
update(this.state, {
room: {
[e.target.name]: {$set: e.target.value}
}
})
}
和储备属性
changeEvent(e){
update(this.state, {
room: {
reserver: {
[e.target.name]: {$set: e.target.value}
}
}
})
}
但即使它正在获取值和名称,它也不会更新状态。什么是问题?
解决方案
我会说,使用immer-js
https://immerjs.github.io/immer/docs/produce
这非常简单,无需学习 api,例如immutability-helpers
$push、$set 等。
这是他们页面中的示例
import produce from "immer"
const baseState = [
{
todo: "Learn typescript",
done: true
},
{
todo: "Try immer",
done: false
}
]
const nextState = produce(baseState, draftState => {
draftState.push({todo: "Tweet about it"})
draftState[1].done = true
})
在你的场景中
import produce from "immer"
changeEvent(e){
this.setState(produce(draftState => {
draftState.room.reserver[e.target.name] = e.target.value;
}););
}
推荐阅读
- swift - 如何使用 SceneKit 进行寻路(3D 障碍物)
- java - 如何在 Springt Boot 中创建一个调用包含构造函数注入的服务的测试?
- javascript - 使用 Python 下载 JavaScript 加载的音频
- google-cloud-firestore - 如何使用 Google Cloud Functions 将这个大型 JSON 导入 Firestore 数据库?
- python - 如何返回对象序列的最大值,其中每个对象具有不同值的相同字段?
- reactjs - React.js 中的匹配总是不返回任何内容
- node.js - 将多个视频合并为一个 .mp4
- python-3.x - For 循环/错误:“NoneType”类型的对象没有 len()
- android - Android中加载事件中的异常行为
- pytorch - 在pytorch中实现的vgg16的训练损失并没有减少