ReactJS Aktualisierung ein einzelnes Objekt im inneren eines Staates array
Ich habe einen Staat namens this.state.devices
was ist ein array von device
Objekte.
Sagen, dass ich eine Funktion
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});
}
}
Problem hier ist, dass jedes mal, wenn this.updateSomething
aufgerufen wird, wird das gesamte array aktualisiert wird, und so der gesamte DOM wird neu gerendert. In meiner situation, dies bewirkt, dass der browser einfrieren, wie rufe ich diese Funktion ziemlich jeder zweite, und es gibt viele device
Objekte. Aber bei jedem Anruf, nur eine oder zwei dieser Geräte, die tatsächlich aktualisiert werden.
Was sind meine Optionen?
BEARBEITEN
Meiner genauen situation, eine device
ist ein Objekt, das wie folgt definiert ist:
function Device(device) {
this.id = device.id;
//And other properties included
}
Also jedes Element in dem array der state.devices
ist ein bestimmter Augenblick dieses Device
, also irgendwo hätte ich:
addDevice: function (device) {
var newDevice = new Device(device);
this.setState({devices: this.state.devices.push(device)});
}
Meine aktualisierte Antwort, wie auf updateSomething
habe ich:
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);
}
}
Problem ist jetzt, dass ich die Fehlermeldung nicht Lesen kann, den undefinierten Wert von id
, und es kommt aus der function Device()
; es scheint, dass eine neue new Device()
aufgerufen wird und die device
ist nicht auf ihn übergegangen ist.
- Es gibt Möglichkeiten, um zu verhindern, dass das Rendern jedes mal wie shouldComponentUpdate, check out this post codementor.io/reactjs/tutorial/verstehen-reagieren-js-rendering. Darüber hinaus sparen Sie einige Ausführungszeit, wenn Sie finden einen Weg, um den index mit dem Gerät anstelle von Zuordnung und Suche für Sie jedes mal. Sie sind auch technisch ändern der array im Staat, die behandelt werden sollten als unveränderliche, empfehlen .slice() per stackoverflow.com/questions/26505064/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die reagieren Unveränderlichkeit Helfer.
Aus der docs:
Einfache push -
initialArray noch [1, 2, 3].
Also bei deinem Beispiel werden Sie wollen, um etwas wie das hier tun:
Je nachdem, wie Komplex Ihre
device
Modell ist, konnte man nur 'ändern' die Objekt-Eigenschaften-in-situ:initialArray
ist ein array von instant von Objekten; d.h. ich habeMyObject()
undinitialArray.push(new MyObject(object))
ist, wie ich diese hinzufügen. Als ich versuchte Ihr Ansatz, ich bekomme ein Fehler in diesem Objekt bei der Initialisierung. Es sagt kann nicht Lesen-Eigenschaft unbekannt; es ist nach einem Feld suchen inobject
. Ist diesupdate
neu zu erstellen, die jedes Objekt, und das ist, warum es ausfällt?devices
vor Ihrervar updatedDevices...
Linie undupdatedDevices
nach. Ich denke, die Struktur wird anders sein.this.setState
. Es ist diehelp
Funktion wirft Fehler.help
Funktion?update
!!Meiner Meinung nach mit reagieren Zustand, nur store-Sachen, die wirklich im Zusammenhang mit "Staat", wie sich die Dinge aktivieren, deaktivieren, aber es gibt natürlich auch Ausnahmen.
Wenn ich du wäre würde ich Weg ziehen, die eine Vielzahl von Endgeräten, wie Sie eine variable und setzen Sie die Dinge gibt, so ist das, was ich tun könnte:
Aus irgendeinem Grund über Antworten hat bei mir nicht funktioniert. Nach vielen versuchen die unten haben:
Und ich importiert
update
ausimmutability-helper
basierend auf dem Hinweis aus: https://reactjs.org/docs/update.html