Có nhiều cách để làm điều này, vì cập nhật trạng thái là một hoạt động không đồng bộ , vì vậy để cập nhật đối tượng trạng thái, chúng ta cần sử dụng chức năng cập nhật với setState
.
1- Đơn giản nhất:
Đầu tiên tạo một bản sao jasper
sau đó thực hiện các thay đổi trong đó:
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
})
Thay vì sử dụng Object.assign
chúng ta cũng có thể viết nó như thế này:
let jasper = { ...prevState.jasper };
2- Sử dụng toán tử trải :
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
}
}))
Lưu ý: Object.assign
và Spread Operator
chỉ tạo bản sao nông , vì vậy nếu bạn đã xác định đối tượng lồng hoặc mảng đối tượng, bạn cần một cách tiếp cận khác.
Cập nhật đối tượng trạng thái lồng nhau:
Giả sử bạn đã xác định trạng thái là:
this.state = {
food: {
sandwich: {
capsicum: true,
crackers: true,
mayonnaise: true
},
pizza: {
jalapeno: true,
extraCheese: false
}
}
}
Để cập nhật thêmCheese của đối tượng 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
}
}
}))
Cập nhật mảng các đối tượng:
Giả sử bạn có ứng dụng việc cần làm và bạn đang quản lý dữ liệu ở dạng này:
this.state = {
todoItems: [
{
name: 'Learn React Basics',
status: 'pending'
}, {
name: 'Check Codebase',
status: 'pending'
}
]
}
Để cập nhật trạng thái của bất kỳ đối tượng việc cần làm nào, hãy chạy bản đồ trên mảng và kiểm tra một số giá trị duy nhất của từng đối tượng, trong trường hợp condition=true
, trả về đối tượng mới có giá trị được cập nhật, cùng một đối tượng.
let key = 2;
this.setState(prevState => ({
todoItems: prevState.todoItems.map(
el => el.key === key? { ...el, status: 'done' }: el
)
}))
Gợi ý: Nếu đối tượng không có giá trị duy nhất, thì hãy sử dụng chỉ mục mảng.
age
tài sản bên trongjasper
.