Tôi có một trạng thái được gọi là this.state.devices
là một mảng của các đối tượng device
.ReactJS cập nhật một đối tượng duy nhất trong một dải trạng thái
Nói rằng tôi có một hàm
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});
}
}
Vấn đề ở đây là mỗi lần this.updateSomething
được gọi là, toàn bộ mảng được cập nhật, và do đó toàn bộ DOM được tái-rendered. Trong tình huống của tôi, điều này làm cho trình duyệt bị đóng băng khi tôi gọi hàm này khá tốt mỗi giây và có rất nhiều đối tượng device
. Tuy nhiên, trên mọi cuộc gọi, chỉ một hoặc hai thiết bị này thực sự được cập nhật.
Tùy chọn của tôi là gì?
EDIT
Trong tình huống chính xác của tôi, một device
là một đối tượng được định nghĩa như sau:
function Device(device) {
this.id = device.id;
// And other properties included
}
Vì vậy, mỗi mục trong mảng của state.devices
là một khoảnh khắc đặc biệt của Device
này, tức là một nơi nào đó tôi có:
addDevice: function (device) {
var newDevice = new Device(device);
this.setState({devices: this.state.devices.push(device)});
}
Trình cập nhật của tôi ed trả lời như thế nào vào updateSomething
, tôi có:
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);
}
}
Vấn đề bây giờ là tôi nhận được một lỗi nói rằng không thể đọc được giá trị không xác định của id
, và nó đến từ các function Device()
; có vẻ như new Device()
mới đang được gọi và device
không được chuyển cho nó.
Có nhiều cách để ngăn chặn render mỗi lần như shouldComponentUpdate, hãy kiểm tra bài này https: // www.codementor.io/reactjs/tutorial/understanding-react-js-rendering. Ngoài ra, bạn sẽ tiết kiệm thời gian thực hiện nếu bạn tìm cách giữ chỉ mục bằng thiết bị thay vì ánh xạ và tìm kiếm nó mỗi lần. Bạn cũng thay đổi về mặt kỹ thuật mảng trong trạng thái, cần được coi là không thay đổi, đề xuất sử dụng .slice() theo http://stackoverflow.com/questions/26505064/react-js-what-is-the-best-way -to-add-a-value-to-an-array-in-state –