ใช่มีตั้งแต่การsetState
ทำงานในasynchronous
ทาง หมายความว่าหลังจากที่เรียกตัวแปรจะไม่เปลี่ยนแปลงทันที ดังนั้นหากคุณต้องการดำเนินการทันทีหลังจากตั้งค่าสถานะในตัวแปรสถานะแล้วส่งคืนผลลัพธ์การเรียกกลับจะมีประโยชน์setState
this.state
ลองพิจารณาตัวอย่างด้านล่าง
....
changeTitle: function changeTitle (event) {
this.setState({ title: event.target.value });
this.validateTitle();
},
validateTitle: function validateTitle () {
if (this.state.title.length === 0) {
this.setState({ titleError: "Title can't be blank" });
}
},
....
รหัสข้างต้นอาจไม่ทำงานตามที่คาดไว้เนื่องจากtitle
ตัวแปรอาจไม่ได้กลายพันธุ์ก่อนที่จะทำการตรวจสอบความถูกต้อง ตอนนี้คุณอาจสงสัยว่าเราสามารถทำการตรวจสอบความถูกต้องในrender()
ฟังก์ชั่นของตัวเอง แต่มันจะดีกว่าและเป็นวิธีที่สะอาดกว่าถ้าเราสามารถจัดการสิ่งนี้ในฟังก์ชั่น changeTitle ได้เองเพราะนั่นจะทำให้รหัสของคุณเป็นระเบียบ
ในกรณีนี้การโทรกลับมีประโยชน์
....
changeTitle: function changeTitle (event) {
this.setState({ title: event.target.value }, function() {
this.validateTitle();
});
},
validateTitle: function validateTitle () {
if (this.state.title.length === 0) {
this.setState({ titleError: "Title can't be blank" });
}
},
....
อีกตัวอย่างหนึ่งคือเมื่อคุณต้องการdispatch
และการกระทำเมื่อมีการเปลี่ยนแปลงสถานะ คุณจะต้องทำมันในการติดต่อกลับและไม่ใช่สิ่งrender()
ที่มันจะถูกเรียกว่าการแสดงผลซ้ำทุกครั้งที่เกิดขึ้นและด้วยเหตุนี้สถานการณ์ดังกล่าวจำนวนมากเป็นไปได้ที่คุณจะต้องโทรกลับ
อีกกรณีหนึ่งคือ API Call
กรณีอาจเกิดขึ้นเมื่อคุณจำเป็นต้องทำการเรียก API ตามการเปลี่ยนแปลงสถานะเฉพาะถ้าคุณทำเช่นนั้นในวิธีการแสดงผลมันจะถูกเรียกในทุกonState
การเปลี่ยนแปลงการแสดงผลหรือเนื่องจาก Prop บางส่วนส่งผ่านไปยังการChild Component
เปลี่ยนแปลง
ในกรณีนี้คุณต้องการใช้ a setState callback
เพื่อส่งผ่านค่าสถานะที่อัพเดตไปยังการเรียก API
....
changeTitle: function (event) {
this.setState({ title: event.target.value }, () => this.APICallFunction());
},
APICallFunction: function () {
// Call API with the updated value
}
....