我有一個名爲this.state.devices
的狀態,它是一個device
對象的數組。ReactJS更新狀態數組中的單個對象
說我有一個函數在這裏
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被重新呈現。在我的情況下,這會導致瀏覽器凍結,因爲我每秒都會調用此函數,並且有很多對象。但是,在每次通話中,實際只更新一個或兩個這些設備。
我有什麼選擇?
EDIT
以我確切的情況,一個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)});
}
我更新ED怎麼回答到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
未傳遞給它。
有辦法避免每次如shouldComponentUpdate渲染,看看這個帖子https://開頭www.codementor.io/reactjs/tutorial/understanding-react-js-rendering。此外,如果您找到一種方法將索引與設備保持在一起,而不是每次映射和搜索,都會節省一些執行時間。你也在技術上改變狀態數組,應該被視爲不可變的,建議使用.slice()按照http://stackoverflow.com/questions/26505064/react-js-what-is-the-best-way添加數值到數組狀態 –