javascript - 在保留类类型的同时为嵌套对象反应 setState
问题描述
从这个问题扩展React Set State For Nested Object
更新嵌套状态的方法是分解对象并重新构造它,如下所示:
this.setState({ someProperty: { ...this.state.someProperty, flag: false} });
但是,这对我来说是个问题,因为它不会保留组件类(下面有更多详细信息)。我的目标是使我的状态结构如下:
this.state = {
addressComponent: {
street: '',
number: '',
country: ''
},
weather: {
/* some other state*/
}
}
为了让我的生活更轻松,我创建了一个简单的地址类,它为我构建对象并具有其他一些实用功能,例如验证。
class AddressComponent {
constructor(street, number, country) {
this.street = street;
this.number = number;
this.country = country;
}
validate() {
if (this.street && this.number, this.country) {
return true;
}
return false;
}
}
这允许我做的是将状态的初始化更改为:
this.state = {
addressComponent : new AddressComponent(),
weather: new WeatherComponent();
}
this will allow my view component to perform nice things like
if (this.state.addressComponent.validate()) {
// send this state to parent container
}
这种方法的问题是,如果我想改变一个单一的信息,比如国家,并使用上面的 Stack Overflow 方法,例如:
this.setState({addressComponent: {...addressComponent, country: 'bluh'}})
这样做意味着解析 addressComponent 不再是 AddressComponent 类的一部分,因此没有 validate() 函数
为了解决这个问题,我可以每次都重新创建一个新AddressComponent
课程,例如:
this.setState({addressComponent: new AddressComponent(this.state.street, this.state.number, 'bluh');
但这似乎很奇怪。
我做错了吗?有更好的方法吗?将这样的类与反应一起使用是否可以接受?
解决方案
我认为你所说的每次在你的状态下更新你的类时重新实例化你的类是确保你的validate()
方法在那个时候被调用的最干净的方法。如果是我,我可能会写成:
const { addressComponent } = this.state;
this.setState({ addressComponent: new AddressComponent(addressComponent.street, addressComponent.number, 'bluh') });
推荐阅读
- php - 正则表达式的问题
- android - mapbox 导航 ondidfinishloadingstyle 异常
- qt - 连接特定信号和插槽一次,然后断开它们
- c# - 如何使用多个参数对对象列表执行搜索?
- python - Pytorch 参数()在收集到列表或保存在生成器中时表现不同
- python - PyTorch:在没有 CPU 传输的情况下渲染点云?
- casting - 在 Power BI 中将字符串列转换为 int
- javascript - CalendarList:列表不返回日历列表
- php - 查询内容最多的前 5 个类别,每个类别返回 5 个内容,并使用 laravel 将 associaled 用户名与内容连接起来
- java - 如何检测另一个应用程序浮动按钮是否在我们的应用程序之上?