Il existe de multiples façons de procéder, puisque la mise à jour de l'état est une opération asynchrone donc pour mettre à jour l'objet d'état, nous devons utiliser fonction de mise à jour avec setState
.
1- La plus simple :
Créez d'abord une copie de jasper
puis faire les changements dans ce domaine :
this.setState(prevState => {
let jasper = Object.assign({}, prevState.jasper); // creating copy of state variable jasper
jasper.name = 'someothername'; // update the name property, assign a new value
return { jasper }; // return new object jasper object
})
Au lieu d'utiliser Object.assign
on peut aussi l'écrire comme ceci :
let jasper = { ...prevState.jasper };
2- Utilisation syntaxe de l'étalement :
this.setState(prevState => ({
jasper: { // object that we want to update
...prevState.jasper, // keep all other key-value pairs
name: 'something' // update the value of specific key
}
}))
Note : Object.assign
et Spread Operator
crée uniquement copie superficielle Par conséquent, si vous avez défini des objets ou des tableaux d'objets imbriqués, vous devez adopter une approche différente.
Mise à jour de l'objet d'état imbriqué :
Supposons que vous ayez défini l'état comme :
this.state = {
food: {
sandwich: {
capsicum: true,
crackers: true,
mayonnaise: true
},
pizza: {
jalapeno: true,
extraCheese: false
}
}
}
Pour mettre à jour l'extraCheese de l'objet pizza :
this.setState(prevState => ({
food: {
...prevState.food, // copy all other key-value pairs of food object
pizza: { // specific object of food object
...prevState.food.pizza, // copy all pizza key-value pairs
extraCheese: true // update value of specific key
}
}
}))
Mise à jour d'un tableau d'objets :
Supposons que vous ayez une application de tâches à faire, et que vous gériez les données dans ce formulaire :
this.state = {
todoItems: [
{
name: 'Learn React Basics',
status: 'pending'
}, {
name: 'Check Codebase',
status: 'pending'
}
]
}
Pour mettre à jour le statut de n'importe quel objet à faire, exécutez une carte sur le tableau et vérifiez la valeur unique de chaque objet, dans le cas de condition=true
retourne le nouvel objet avec la valeur mise à jour, sinon le même objet.
let key = 2;
this.setState(prevState => ({
todoItems: prevState.todoItems.map(
el => el.key === key? { ...el, status: 'done' }: el
)
}))
Suggestion : Si l'objet n'a pas de valeur unique, il faut utiliser l'index du tableau.
12 votes
Le deuxième code aurait fonctionné mais vous auriez perdu le
age
propriété à l'intérieurjasper
.1 votes
Je comprends que React utilise .assign() pour. fusionner l'ancien objet d'état avec le nouvel objet, donc le second code ne devrait-il pas fonctionner correctement ?