Es gibt mehrere Möglichkeiten, dies zu tun, da die Statusaktualisierung eine asynchrone Operation ist. Um das Statusobjekt zu aktualisieren, müssen wir die Updater-Funktion mit verwenden setState
.
1- Einfachste:
Erstellen Sie zuerst eine Kopie von und nehmen Sie jasper
dann die folgenden Änderungen vor:
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
})
Anstatt zu verwenden Object.assign
, können wir es auch so schreiben:
let jasper = { ...prevState.jasper };
2- Verwenden des Spread-Operators :
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
}
}))
Hinweis: Object.assign
und Spread Operator
erstellt nur eine flache Kopie . Wenn Sie also ein verschachteltes Objekt oder ein Array von Objekten definiert haben, benötigen Sie einen anderen Ansatz.
Verschachteltes Statusobjekt aktualisieren:
Angenommen, Sie haben den Status wie folgt definiert:
this.state = {
food: {
sandwich: {
capsicum: true,
crackers: true,
mayonnaise: true
},
pizza: {
jalapeno: true,
extraCheese: false
}
}
}
So aktualisieren Sie extraCheese des Pizzaobjekts:
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
}
}
}))
Array von Objekten aktualisieren:
Nehmen wir an, Sie haben eine ToDo-App und verwalten die Daten in folgender Form:
this.state = {
todoItems: [
{
name: 'Learn React Basics',
status: 'pending'
}, {
name: 'Check Codebase',
status: 'pending'
}
]
}
Um den Status eines Aufgabenobjekts zu aktualisieren, führen Sie eine Zuordnung auf dem Array aus und suchen Sie nach einem eindeutigen Wert für jedes Objekt. Geben Sie im Falle von condition=true
das neue Objekt mit dem aktualisierten Wert zurück, andernfalls dasselbe Objekt.
let key = 2;
this.setState(prevState => ({
todoItems: prevState.todoItems.map(
el => el.key === key? { ...el, status: 'done' }: el
)
}))
Vorschlag: Wenn das Objekt keinen eindeutigen Wert hat, verwenden Sie den Array-Index.
age
Eigenschaft im Inneren verlorenjasper
.