我有一个名为this.state.devices
的状态,它是一个包含device
对象的数组。
假设我有一个函数:
updateSomething: function (device) {
var devices = this.state.devices;
var index = devices.map(function(d){
return d.id;
}).indexOf(device.id);
if (index !== -1) {
// do some stuff with device
devices[index] = device;
this.setState({devices:devices});
}
}
问题在于每次调用this.updateSomething
时,整个数组都会被更新,整个DOM也会被重新渲染。在我的情况下,这导致浏览器卡死,因为我几乎每秒钟调用一次这个函数,而且有很多device
对象。然而,在每次调用时,只有一个或两个这些设备实际上会被更新。我的选择是什么?
编辑:
在我的具体情况下,一个
device
是一个被定义如下的对象:function Device(device) {
this.id = device.id;
// And other properties included
}
因此,state.devices
数组中的每个项都是这个 Device
的特定实例,也就是说,在某个地方我会有:
addDevice: function (device) {
var newDevice = new Device(device);
this.setState({devices: this.state.devices.push(device)});
}
关于如何更新 updateSomething
,我的最新回答是:
updateSomething: function (device) {
var devices = this.state.devices;
var index = devices.map(function(d){
return d.id;
}).indexOf(device.id);
if (index !== -1) {
// do some stuff with device
var updatedDevices = update(devices[index], {someField: {$set: device.someField}});
this.setState(updatedDevices);
}
}
现在的问题是我收到一个错误,说无法读取id
的未定义值,并且它来自function Device()
;似乎调用了一个新的new Device()
并且device
没有被传递给它。