Ich scheine Probleme zu haben, Daten in ein Zustandsarray zu schieben ... Ich versuche es auf diese Weise zu erreichen:
this.setState({ myArray: this.state.myArray.Push('new value') })
Aber ich glaube, das ist ein falscher Weg und verursacht Probleme mit der Veränderlichkeit?
this.state.myArray.Push('new value')
gibt die Länge des erweiterten Arrays anstelle des Arrays selbst zurück.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Push
Sie gehen davon aus, dass der zurückgegebene Wert das Array ist.
Es scheint, dass es eher das Verhalten von React ist:
NIEMALS, this.state NIEMALS direkt zu mutieren, da der Aufruf von setState () danach möglicherweise Ersetzen Sie die Mutation, die Sie gemacht haben. Behandle diesen Zustand so, als wäre er unveränderlich.
Ich denke, Sie würden es so machen (mit React nicht vertraut):
var joined = this.state.myArray.concat('new value');
this.setState({ myArray: joined })
Mit es6 geht das so:
this.setState({ myArray: [...this.state.myArray, 'new value'] }) //simple value
this.setState({ myArray: [...this.state.myArray, ...[1,2,3] ] }) //another array
Niemals empfohlen, den Zustand direkt zu mutieren.
Der empfohlene Ansatz in späteren React-Versionen ist die Verwendung einer Aktualisierungsfunktion, wenn Status geändert werden, um Race-Bedingungen zu verhindern:
Drücken Sie die Zeichenfolge an das Ende des Arrays
this.setState(prevState => ({
myArray: [...prevState.myArray, "new value"]
}))
String an den Anfang des Arrays schieben
this.setState(prevState => ({
myArray: ["new value", ...prevState.myArray]
}))
Objekt an das Ende des Arrays schieben
this.setState(prevState => ({
myArray: [...prevState.myArray, {"name": "object"}]
}))
Objekt an den Anfang des Arrays schieben
this.setState(prevState => ({
myArray: [ {"name": "object"}, ...prevState.myArray]
}))
Sie können die Methode .concat
verwenden, um eine Kopie Ihres Arrays mit neuen Daten zu erstellen:
this.setState({ myArray: this.state.myArray.concat('new value') })
Beachten Sie jedoch das spezielle Verhalten der .concat
-Methode beim Übergeben von Arrays. [1, 2].concat(['foo', 3], 'bar')
führt zu [1, 2, 'foo', 3, 'bar']
.
Sie sollten den Zustand überhaupt nicht bedienen. Zumindest nicht direkt. Wenn Sie Ihr Array aktualisieren möchten, müssen Sie so etwas tun.
var newStateArray = this.state.myArray.slice();
newStateArray.Push('new value');
this.setState(myArray: newStateArray);
Das direkte Bearbeiten des Zustandsobjekts ist nicht wünschenswert. Sie können auch einen Blick auf die Unveränderlichkeitshilfen von React werfen.
Dieser Kodex funktioniert für mich:
fetch('http://localhost:8080')
.then(response => response.json())
.then(json => {
this.setState({mystate: this.state.mystate.Push.apply(this.state.mystate, json)})
})
wenn Sie außerdem möchten, dass Ihre Benutzeroberfläche (dh Ihre FlatList) auf dem neuesten Stand ist, verwenden Sie PrevState: In der folgenden Untersuchung wird der Benutzer auf die Schaltfläche klicken, um ein neues Objekt zur Liste hinzuzufügen Modell und die Benutzeroberfläche)
data: ['shopping','reading'] // declared in constructor
onPress={() => {this.setState((prevState, props) => {
return {data: [new obj].concat(prevState.data) };
})}}.