มีหลายวิธีการทำเช่นนี้จะมีตั้งแต่การปรับปรุงรัฐคือการดำเนินงาน asyncเพื่อที่จะปรับปรุงวัตถุรัฐเราต้องใช้อัพเดทฟังก์ชั่นsetState
ที่มี
1- หนึ่งที่ง่ายที่สุด:
ก่อนอื่นให้สร้างสำเนาจากjasper
นั้นทำการเปลี่ยนแปลงที่:
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
})
แทนที่จะใช้Object.assign
เราสามารถเขียนดังนี้:
let jasper = { ...prevState.jasper };
2- การใช้โอเปอเรเตอร์การแพร่กระจาย :
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
}
}))
หมายเหตุ: Object.assign
และSpread Operator
สร้างสำเนาตื้นเท่านั้นดังนั้นหากคุณกำหนดวัตถุที่ซ้อนกันหรืออาร์เรย์ของวัตถุคุณต้องใช้วิธีการอื่น
การอัพเดตอ็อบเจ็กต์สถานะซ้อนกัน:
สมมติว่าคุณได้กำหนดสถานะเป็น:
this.state = {
food: {
sandwich: {
capsicum: true,
crackers: true,
mayonnaise: true
},
pizza: {
jalapeno: true,
extraCheese: false
}
}
}
ในการอัปเดตชีสชีสของวัตถุพิเศษให้ทำดังนี้
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
}
}
}))
การอัปเดตอาร์เรย์ของวัตถุ:
สมมติว่าคุณมีแอพที่ต้องทำและคุณกำลังจัดการข้อมูลในแบบฟอร์มนี้:
this.state = {
todoItems: [
{
name: 'Learn React Basics',
status: 'pending'
}, {
name: 'Check Codebase',
status: 'pending'
}
]
}
หากต้องการอัพเดตสถานะของวัตถุใด ๆ ที่ต้องทำให้เรียกใช้แผนที่บนอาร์เรย์และตรวจสอบค่าที่ไม่ซ้ำกันของแต่ละวัตถุในกรณีที่condition=true
ส่งคืนวัตถุใหม่ด้วยค่าที่อัปเดตหรือวัตถุอื่นที่เหมือนกัน
let key = 2;
this.setState(prevState => ({
todoItems: prevState.todoItems.map(
el => el.key === key? { ...el, status: 'done' }: el
)
}))
คำแนะนำ:หากวัตถุไม่มีค่าที่ไม่ซ้ำกันให้ใช้ดัชนีอาร์เรย์
age
jasper