ในเนื้อหาที่ผ่านมา เราได้พูดถึง Built-in Directives ไปบ้างแล้ว โดยเฉพาะ
สามารถกลับไปทบทวนได้ที่บทความ
ทำความรู้จัก Attribute Bindings และ Directives ใน VueJS http://niik.in/1085
https://www.ninenik.com/content.php?arti_id=1085 via @ninenik
โดยใน Built-in Directives ที่ใช้สำหรับกำหนดเงื่อนไขการ render เพื่อแสดงในส่วนของ
template รูปแบบเงื่อนไขจะไม่ยุ่งยาก เหมือนโครงสร้าง control flow ของการเขียนโปรแกรม
ทั่วไปที่ทุกคนน่าจะคุ้นเคยกันแล้ว ในเนื้อหานี้เราจะมาดูเกี่ยวกับ directive ต่อไปนี้เพิ่มเติม
Directive สำหรับกำหนดเงื่อนไข กับการ render หรือการแสดงผล
v-if: ใช้เพื่อแสดงหรือซ่อน element ขึ้นอยู่กับเงื่อนไขที่กำหนด ในรูปแบบการเพิ่ม หรือ ลบ
DOM เข้ามาใน template ไม่ใช่ก่อนซ่อนด้วย css style
v-show: ใช้เพื่อแสดงหรือซ่อน element โดยอ้างอิงกับเงื่อนไขที่กำหนด แตกต่างจาก v-if
โดยวิธีการทำงาน โดยจะเป็นการซ่อนด้วย css style display โดยที่ไม่ได้ลบ DOM ออกจาก
template ที่แสดง เพียงแต่เป็นการซ่อนไว้
v-else-if: ใช้ในการกำหนดเงื่อนไขเพิ่มเติมในการตรวจสอบหลายเงื่อนไขเมื่อใช้ร่วมกับ v-if
และ v-else
v-else: ใช้ในการกำหนดส่วนของเทมเพลตที่จะแสดงเมื่อเงื่อนไขของ v-if หรือ v-else-if
ก่อนหน้านั้นไม่เป็นเท็จ (false)
v-for: ใช้สำหรับการทำซ้ำ element โดยอ้างอิงจากข้อมูลในอาร์เรย์หรือออปเจ็กต์
เปรียบเทียบ Control Flow ในการเขียนโปรแกรม
if(){ // เงื่อนไขเริ่มต้น }else if(){ // เงื่อนไขเพิ่มเติม }else{ // ไม่เข้าเงื่อนไขที่กำหนด }
ตัวอย่างการใช้ v-if / v-else-if / v-else
<script setup> import { ref } from 'vue' const type = ref("A") </script> <template> <button @click="type = 'A'">A</button> <button @click="type = 'B'">B</button> <button @click="type = 'C'">C</button> <button @click="type = 'D'">D</button> <div v-if="type === 'A'"> A </div> <div v-else-if="type === 'B'"> B </div> <div v-else-if="type === 'C'"> C </div> <div v-else> Not A/B/C </div> </template>
เมื่อเริ่มโหลด จะมีแค่ div ที่มีตัว A อยู่แสดง เพราะค่าเริ่มต้นเรากำหนดค่า type เท่ากับ A
และเราให้มีเหตุการณ์ถ้าคลิกที่ปุ่มต่างๆ จะเปลี่ยนค่า type เป็นค่านั้น ซึ่งจะมีผลต่อเงื่อนไข
การแสดง โดย div จะแสดงเป็นมีข้อความเป็น A B หรือ C ถ้ากดที่ปุ่มอักษรต่างๆ แต่ถ้ากดปุ่ม
D จะเข้าเงื่อนไขสุดท้าย แสดงข้อความ Not A/B/C เพราะค่า type เป็น D นั่นเอง
ในการสร้างเงื่อนไขแบบ switch หรือปุ่มซ่อน แสดง ตามเงื่อนไขค่า จริงหรือเท็จ เราสามารถใช้
รูปแบบดังนี้ได้
<script setup> import { ref } from 'vue' const awesome = ref(true) </script> <template> <button @click="awesome = !awesome">Toggle</button> <h1 v-if="awesome">Vue is awesome!</h1> <h1 v-else>Oh no 😢</h1> </template>
ผลลัพธ์ที่ได้
![](https://i.imgur.com/tDioKHz.jpeg)
สังเกตว่า ใน DOM จะเป็นแสดงเฉพาะ div ที่มีค่า expression เข้าเงื่อนไข
แต่เมื่อเราคลิกที่ปุ่ม สลับค่า หรือปุ่ม toggle ผลลัพธ์ ก็จะได้เป็น
![](https://i.imgur.com/pbcaYzV.jpeg)
ตัว DOM ของค่าเดิมจะถูกลบออกไป และแสดงด้วย DOM ใหม่ที่เข้าเงื่อนไข
ดูส่วนของการกำหนด เงื่อนไขการทำงาน หรือ expression ให้กับเหตุการณ์หรือ event
เมื่อคลิก โดยใช้รูปแบบ ให้ค่า เปลี่ยนเป็นค่าตรงข้าม ทุกครั้งที่คลิก ดังนั้น ค่าของ state ก็จะ
สลับไปมา จริง เท็จ สลับกัน ทุกครั้งที่กดปุ่ม
<button @click="awesome = !awesome">Toggle</button>
การทำงานของ v-show
ทีนี้เรามาดูการทำงานของ v-show บ้าง แก้โค้ดข้างต้นเล็กน้อย จะได้เป็นดังนี้
<script setup> import { ref } from 'vue' const awesome = ref(true) </script> <template> <button @click="awesome = !awesome">Toggle</button> <h1 v-show="awesome">Vue is awesome!</h1> <h1 v-show="!awesome">Oh no 😢</h1> </template>
ดูผลลัพธ์ค่าเริ่มต้น
![](https://i.imgur.com/uYn8MA1.jpeg)
สังเกตว่า DOM ของ h1 ทั้งแสดงตัวแสดงใน template แต่ตัวที่เข้าเงื่อนไขค่า false จะถูก
ซ่อนด้วยรูปแบบ css style display เป็น none และเมื่อเรากดที่ปุ่มเพื่อเปลี่ยนค่า state ของ
awesome ผลก็จะได้เป็นดังนี้
![](https://i.imgur.com/T7m4JEu.jpeg)
ตัว css style display จะซ่อนค่าที่เข้าเงื่อนไข โดยที่ทั้งสอง element ยังอยู่ใน template
ซึ่งต่างจากการใช้งาน v-if ที่เป็นซ่อนหรือแสดงในลักษณะการเพิ่ม หรือ ลบ DOM element
ออกจาก template ดังนั้น เราอาจจะกล่าวได้ว่า v-if เป็นเงื่อนไขการ render ที่แท้จริง เพราะ
มีทั้งการลบ และสร้างใหม่ เพิ่มเข้ามาใน template
สำหรับ v-show จะเหมาะสำหรับการกำหนดให้กับส่วนที่จำเป็นต้องซ่อนหรือแสดงบ่อย เพราะจะ
ได้ลดการทำงานซ้ำๆ บ่อยๆ หากใช้ v-if ที่มีการสร้างใหม่และลบ ถือเป็นต้นทุนการทำงานหรือ
ใช้ทรัพยากรมากกว่า
เนื้อหาตอนหน้าเราติดค้างเกียวกับ v-for มารอดูต่อ ติดตามได้ในบทความถัดไป