J'ai un tableau dans l'état, disons this.state.arr . Je veux ajouter quelque chose à cette propriété d'état, puis changer quelques propriétés supplémentaires.
Option 1
onChange(event){
this.state.arr.Push('newvalue');
...
this.setState({some:'val',arr:this.state.arr})
}
Option 2
onChange(event){
var newArr = this.state.arr;
...
newArr.Push('newvalue');
...
this.setState({some:'val',arr:newArr})
}
Donc .. Je sais que cet état est censé être traité de manière immuable. Mais est-il possible de l’utiliser comme dans l’option 1 où j’ai toujours l’état, ou dois-je utiliser quelque chose comme l’option 2, et donc toujours faire une copie en mémoire
Les deux options que vous avez fournies sont les mêmes. Tous les deux vont toujours pointer sur le même objet en mémoire et avoir les mêmes valeurs de tableau. Vous devez traiter l'objet d'état comme immuable, comme vous l'avez dit. Toutefois, vous devez recréer le tableau afin qu'il pointe vers un nouvel objet, définissez le nouvel élément, puis réinitialisez l'état. Exemple:
onChange(event){
var newArray = this.state.arr.slice();
newArray.Push("new value");
this.setState({arr:newArray})
}
Pour l'instant, c'est le meilleur moyen.
this.setState(previousState => ({
myArray: [...previousState.myArray, 'new value']
}));
Si vous utilisez la syntaxe ES6, vous pouvez utiliser l’opérateur spread pour ajouter de nouveaux éléments à un tableau existant en une ligne.
// Append an array
const newArr = [1,2,3,4]
this.setState({ arr: [...this.state.arr, ...newArr] });
// Append a single item
this.setState({ arr: [...this.state.arr, 'new item'] });
Un autre moyen simple d'utiliser concat:
this.setState({
arr: this.state.arr.concat('new value')
})
le meilleur parti maintenant.
this.setState({ myArr: [...this.state.myArr, new_value] })
handleValueChange = (value) => {
let myArr= [...this.state.myArr]
myArr.Push(value)
this.setState({
myArr
})
Cela pourrait faire le travail.
Si vous voulez continuer à ajouter un nouvel objet au tableau que j'ai utilisé:
_methodName = (para1, para2) => {
this.setState({
arr: this.state.arr.concat({para1, para2})
})
}