เนื้อหาตอนต่อไปนี้ เรามาดูเกี่ยวกับขั้นตอนเกิดขึ้นและใช้งานของ
Component ใน vuejs หรือเข้าใจในชื่อว่า Lifecycle กระบวนการลำดับ
ขั้นตอนต่างๆ ของ Component ซึ่งจริงๆ แล้ว เรายังไม่ได้ลงลึกไปเกี่ยวกับ
component เท่าไหร่นัก แต่ก็มี component หลักหรือที่เรียกว่า root
component ที่เราใช้งานมาตั้งแต่แรก ดังนั้น เราจะใช้ lifecycle ของ root
component นี้มาอธิบาย
Lifecycle Hooks คืออะไร
ใน Vue.js Lifecycle Hooks หมายถึงชุดของฟังก์ชันที่ถูกเรียกในช่วงต่างๆ
ของชีวิตของคอมโพเนนต์ (component) ซึ่งช่วยให้นักพัฒนาสามารถเขียนโค้ด
เพื่อดำเนินการต่างๆ ในช่วงเวลาที่เหมาะสมของวงจรชีวิตคอมโพเนนต์
Vue.js มี Lifecycle Hooks หลักๆ ดังนี้:
1. onBeforeMount
onBeforeMount(() => { console.log('beforeMount: Component is about to be mounted to the DOM.') })
- ถูกเรียกก่อนที่คอมโพเนนต์จะถูกแทรกลงใน DOM (Document Object Model)
- ใช้สำหรับการเตรียมการก่อนที่คอมโพเนนต์จะถูกแสดงผลบนหน้าเว็บ
2. onMounted
onMounted(() => { console.log('mounted: Component has been mounted to the DOM.') })
- ถูกเรียกหลังจากที่คอมโพเนนต์ถูกแทรกลงใน DOM แล้ว
- ใช้สำหรับการทำงานที่ต้องการการเข้าถึง DOM เช่น การเรียก API หรือการตั้งค่า
Event Listener
3. onBeforeUpdate
onBeforeUpdate(() => { console.log('beforeUpdate: Data is about to be updated.') })
- ถูกเรียกก่อนที่คอมโพเนนต์จะถูกอัปเดตเมื่อข้อมูลเปลี่ยนแปลง
- ใช้สำหรับการทำงานที่ต้องการเตรียมการก่อนการเปลี่ยนแปลงของ DOM
4. onUpdated
onUpdated(() => { console.log('updated: Data has been updated and the DOM has been re-rendered.') })
- ถูกเรียกหลังจากที่คอมโพเนนต์ถูกอัปเดตและ DOM ถูกแสดงผลใหม่แล้ว
- ใช้สำหรับการทำงานที่ต้องการทราบว่า DOM ได้อัปเดตแล้ว เช่น การอัปเดตข้อมูล
ที่แสดงบนหน้าเว็บ
5. onBeforeUnmount
onBeforeUnmount(() => { console.log('beforeUnmount: Component is about to be unmounted.') })
- ถูกเรียกก่อนที่คอมโพเนนต์จะถูกนำออกจาก DOM
- ใช้สำหรับการทำงานที่ต้องการทำความสะอาดหรือยกเลิกการทำงานก่อนที่คอมโพเนนต์
จะถูกนำออก เช่น การลบ Event Listener
6. onUnmounted
onUnmounted(() => { console.log('unmounted: Component has been unmounted.') })
- ถูกเรียกหลังจากที่คอมโพเนนต์ถูกนำออกจาก DOM แล้ว
- ใช้สำหรับการทำงานที่ต้องการทราบว่าคอมโพเนนต์ได้ถูกนำออกจาก DOM แล้ว เช่น
การล้างข้อมูลหรือการหยุดการทำงานที่ไม่ต้องการ
นอกจาก Lifecycle Hooks หลักเหล่านี้ Vue.js ยังมี onActivated และ onDeactivated
ซึ่งใช้กับ keep-alive components:
7. onActivated
onActivated(() => { console.log('activated: Component in keep-alive is activated.') })
- ถูกเรียกเมื่อคอมโพเนนต์ถูกเปิดใช้งานในสถานะ keep-alive
- ใช้สำหรับการทำงานที่ต้องการเมื่อคอมโพเนนต์ถูกนำกลับมาแสดงผลอีกครั้ง
เช่น การรีเฟรชข้อมูล
8. onDeactivated
onDeactivated(() => { console.log('deactivated: Component in keep-alive is deactivated.') })
- ถูกเรียกเมื่อคอมโพเนนต์ถูกปิดใช้งานในสถานะ keep-alive
- ใช้สำหรับการทำงานที่ต้องการเมื่อคอมโพเนนต์ถูกนำออกจากการแสดงผล เช่น
การหยุดการทำงานที่ไม่จำเป็น
การใช้ Lifecycle Hooks เหล่านี้จะช่วยให้สามารถควบคุมและจัดการการทำงานของ
คอมโพเนนต์ได้อย่างละเอียดและมีประสิทธิภาพมากขึ้นในช่วงต่างๆ ของชีวิตคอมโพเนนต์.
ดูตัวอย่างโค้ด
<script setup> import { ref, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted, onActivated, onDeactivated } from 'vue' const message = ref('') // Lifecycle Hooks onBeforeMount(() => { console.log('beforeMount: Component is about to be mounted to the DOM.') }) onMounted(() => { console.log('mounted: Component has been mounted to the DOM.') }) onBeforeUpdate(() => { console.log('beforeUpdate: Data is about to be updated.') }) onUpdated(() => { console.log('updated: Data has been updated and the DOM has been re-rendered.') }) onBeforeUnmount(() => { console.log('beforeUnmount: Component is about to be unmounted.') }) onUnmounted(() => { console.log('unmounted: Component has been unmounted.') }) onActivated(() => { console.log('activated: Component in keep-alive is activated.') }) onDeactivated(() => { console.log('deactivated: Component in keep-alive is deactivated.') }) </script> <template> <h1>Vue.js Lifecycle Hooks Example</h1> <input v-model="message" placeholder="Type something..." /> <p>Message: {{ message }}</p> </template>
จากตัวอย่างผลลัพธ์ เราสามารถใช้ onMounted เพื่อให้ทำคำสั่งใดๆ หลังจากที่ component
ได้สิ้นสุดการเรนเดอร์และถูกสร้างและเพิ่มเข้าไปใน DOM แล้ว ในตัวอย่างก็คือ root component
ได้ถูกเพิ่มเข้าไปแล้ว ก็จะทำงานในส่วนของ onMounted หรือกรณีที่ต้องการให้ทำงานในส่วน
ของก่นอข้อมูลเปลี่ยนแปลง หรือหลังหลังข้อมูลเปลี่ยนแปลงแล้ว อย่างในตัวอย่าง ก็คือ เมื่อมีการ
พิมพ์ข้อความใน input text ทุกครั้งที่พิมพ์ มีการเปลียนแปลง onBeforeUpdate() กับ
onUpdate() ก็จะเรียกฟังก์ชั่นด้านในให้ทำงาน ตามที่เรากำหนด ถึงแม้ว่าในตัวอย่างจะแสดง
แค่ไม่กี่ event ของ lifecycle hook event ทั้งนี้ก็เพราะเป็น root component ซึ่งถ้า
หากเราสร้าง component เองแล้วนำมาใช้ ก็จะเห็นส่วนอืนๆ เพิ่มเติม เช่น เมื่อลบหรือเอา
component ออก ก็สามารถใช้ onBeforeUnmount() กับ onUnmount() ได้
แผนภาพวงจรชีวิตของคอมโพเนนต์ Lifecycle Diagram
เครื่องมือที่ช่วยให้เราเข้าใจขั้นตอนต่างๆ ในวงจรชีวิตของคอมโพเนนต์ได้ดีขึ้น ช่วยให้รู้ว่า
เราสามารถใช้งาน Lifecycle Hooks ใดในช่วงเวลาไหน และสามารถวางแผนการทำงาน
ของคอมโพเนนต์ได้อย่างมีประสิทธิภาพ
ใน Vue.js Lifecycle Diagram จะแสดงขั้นตอนต่างๆ ของคอมโพเนนต์ ซึ่งประกอบด้วย:
Mounting (การแสดงผล)
- onBeforeMount: ก่อนที่คอมโพเนนต์จะถูกแทรกลงใน DOM
- onMounted: คอมโพเนนต์ถูกแทรกลงใน DOM แล้ว
Updating (การอัปเดต)
- onBeforeUpdate: ก่อนที่คอมโพเนนต์จะอัปเดตเมื่อมีการเปลี่ยนแปลงของ reactive data
- onUpdated: คอมโพเนนต์ถูกอัปเดตและ DOM ได้รับการอัปเดตตามแล้ว
Unmounting (การทำลาย)
- onBeforeUnmount: ก่อนที่คอมโพเนนต์จะถูกนำออกจาก DOM
- onUnmounted: คอมโพเนนต์ถูกนำออกจาก DOM และทำลายแล้ว
Activated/Deactivated (การเปิดใช้งาน/การปิดใช้งาน)
- onActivated: คอมโพเนนต์ที่อยู่ใน keep-alive ถูกเปิดใช้งาน
- onDeactivated: คอมโพเนนต์ที่อยู่ใน keep-alive ถูกปิดใช้งาน
อย่างไรก็ตาม การเรียกใช้งาน Lifecycle Hooks จะต้องเรียกใช้งานแบบ synchronously
หรือทำไปพร้อมๆ กับการตั้งต่าต่างๆ หรือติดตั้ง component จะเรียกใช้งานหลังขั้นตอน
การตั้งค่าไม่ได้ เช่น รูปแบบด้านล่าง จะไม่ทำงาน
setTimeout(() => { onMounted(() => { // this won't work. }) }, 100)
ซึ่งไม่ได้หมายความว่า Lifecycle Hooks จะต้องเขียนไว้ภายใน setup() หรือ
<script setup> เท่านั้น แต่เราสามารถเขียนไว้ในฟังก์ชั่นของไฟล์ภายนอกก็ได้
เพียงเราเรียกงานใน setup() หรือ <script setup> อีกที
เนื้อหาเบื้องต้น เกี่ยวกับ Lifecycle Hooks ก็จะประมาณนี้ เป็นแนวทางให้เราได้
เข้าใจภาพรวมของตัว vuejs เพิ่มขึ้น ตอนหน้าจะเป็นอะไร รอติดตาม