setState()
กำหนดให้เปลี่ยนสถานะคอมโพเนนต์และบอก React ว่าคอมโพเนนต์นี้และลูกของมันจำเป็นต้องแสดงผลอีกครั้งด้วยสถานะที่อัพเดต
เมธอด setState เป็นแบบอะซิงโครนัสและตามความเป็นจริงจะไม่ส่งคืนคำสัญญา ดังนั้นในกรณีที่เราต้องการอัปเดตหรือเรียกใช้ฟังก์ชันสามารถเรียกฟังก์ชันเรียกกลับในฟังก์ชัน setState เป็นอาร์กิวเมนต์ที่สองได้ ตัวอย่างเช่นในกรณีของคุณด้านบนคุณได้เรียกใช้ฟังก์ชันเป็นการเรียกกลับ setState
setState(
{ name: "Michael" },
() => console.log(this.state)
);
โค้ดด้านบนใช้งานได้ดีสำหรับองค์ประกอบคลาส แต่ในกรณีของส่วนประกอบการทำงานเราไม่สามารถใช้เมธอด setState ได้และเราสามารถใช้ use effect hook เพื่อให้ได้ผลลัพธ์เดียวกัน
วิธีการที่ชัดเจนที่นึกถึงคือ ypu สามารถใช้กับ useEffect ได้ดังนี้:
const [state, setState] = useState({ name: "Michael" })
useEffect(() => {
console.log(state)
}, [state])
แต่สิ่งนี้จะเริ่มขึ้นในการเรนเดอร์ครั้งแรกเช่นกันดังนั้นเราจึงสามารถเปลี่ยนรหัสได้ดังนี้ซึ่งเราสามารถตรวจสอบเหตุการณ์การเรนเดอร์แรกและหลีกเลี่ยงการเรนเดอร์สถานะ ดังนั้นการใช้งานสามารถทำได้ด้วยวิธีต่อไปนี้:
เราสามารถใช้ user hook ที่นี่เพื่อระบุการเรนเดอร์แรก
useRef Hook ช่วยให้เราสร้างตัวแปรที่ไม่แน่นอนในส่วนประกอบที่ใช้งานได้ มีประโยชน์สำหรับการเข้าถึงโหนด DOM / องค์ประกอบการตอบสนองและเพื่อจัดเก็บตัวแปรที่เปลี่ยนแปลงได้โดยไม่ต้องทริกเกอร์การเรนเดอร์ซ้ำ
const [state, setState] = useState({ name: "Michael" });
const firstTimeRender = useRef(true);
useEffect(() => {
if (!firstTimeRender.current) {
console.log(state);
}
}, [state])
useEffect(() => {
firstTimeRender.current = false
}, [])