Esistono diversi modi per farlo, poiché l'aggiornamento dello stato è un'operazione asincrona , quindi per aggiornare l'oggetto stato, è necessario utilizzare la funzione di aggiornamento con setState
.
1- Quello più semplice:
Prima crea una copia e jasper
poi fai le modifiche in questo:
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
})
Invece di usare Object.assign
possiamo anche scrivere in questo modo:
let jasper = { ...prevState.jasper };
2- Utilizzo dell'operatore spread :
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
}
}))
Nota: Object.assign
e Spread Operator
crea solo copie superficiali , quindi se hai definito un oggetto nidificato o una matrice di oggetti, hai bisogno di un approccio diverso.
Aggiornamento oggetto stato nidificato:
Supponiamo di aver definito lo stato come:
this.state = {
food: {
sandwich: {
capsicum: true,
crackers: true,
mayonnaise: true
},
pizza: {
jalapeno: true,
extraCheese: false
}
}
}
Per aggiornare extraCheese of pizza object:
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
}
}
}))
Aggiornamento array di oggetti:
Supponiamo che tu abbia un'app todo e che tu gestisca i dati in questo modulo:
this.state = {
todoItems: [
{
name: 'Learn React Basics',
status: 'pending'
}, {
name: 'Check Codebase',
status: 'pending'
}
]
}
Per aggiornare lo stato di qualsiasi oggetto todo, eseguire una mappa sull'array e verificare la presenza di un valore univoco per ogni oggetto, in caso di condition=true
, restituire il nuovo oggetto con valore aggiornato, altrimenti lo stesso oggetto.
let key = 2;
this.setState(prevState => ({
todoItems: prevState.todoItems.map(
el => el.key === key? { ...el, status: 'done' }: el
)
}))
Suggerimento: se l'oggetto non ha un valore univoco, utilizzare l'indice di array.
age
proprietà all'internojasper
.