Dev to webs {Coding…}

เรียนรู้การพัฒนาซอฟเวอร์ เพื่อความรู้ที่ยั่งยืน

บทที่ 19: การใช้ Modifiers ใน x-model


1. ความเข้าใจเกี่ยวกับ Modifiers ใน x-model

Modifiers ใน Alpine.js เป็นคำสั่งเสริมที่ใช้ร่วมกับ x-model เพื่อปรับพฤติกรรมของการผูกค่าระหว่างอินพุตและ State โดย Modifiers ช่วยควบคุมว่าข้อมูลจะถูกอัปเดตใน State อย่างไร เช่น:

  • .lazy: อัปเดต State เมื่ออินพุตเสียโฟกัส (blur)
  • .debounce: หน่วงเวลาการอัปเดต State
  • .number: แปลงค่าที่รับมาเป็นตัวเลข
  • .trim: ตัดช่องว่างหน้าและหลังของข้อความ

2. การใช้ Modifiers .lazy

.lazy จะทำให้อัปเดตค่าใน State เมื่ออินพุตเสียโฟกัสเท่านั้น ไม่ใช่ทุกครั้งที่ผู้ใช้พิมพ์

ตัวอย่าง:
<div x-data="{ name: '' }">
    <label for="name">Name:</label>
    <input type="text" id="name" x-model.lazy="name">
    <p x-text="`Hello, ${name}`"></p>
</div>

คำอธิบาย:

  • x-model.lazy="name" จะอัปเดตค่าใน name เมื่ออินพุตเสียโฟกัส
  • ขณะพิมพ์ข้อความในอินพุต ค่า name จะยังไม่เปลี่ยน จนกระทั่งผู้ใช้กด Tab หรือคลิกที่อื่น

3. การใช้ Modifiers .debounce

.debounce ใช้เพื่อหน่วงเวลาการอัปเดต State หลังจากผู้ใช้หยุดพิมพ์ เช่น 500 มิลลิวินาที

ตัวอย่าง:
<div x-data="{ search: '' }">
    <label for="search">Search:</label>
    <input type="text" id="search" x-model.debounce.500ms="search">
    <p x-text="`Searching for: ${search}`"></p>
</div>

คำอธิบาย:

  • x-model.debounce.500ms="search" หน่วงเวลา 500 มิลลิวินาทีหลังจากผู้ใช้หยุดพิมพ์
  • ลดการอัปเดต State บ่อยครั้ง ซึ่งมีประโยชน์เมื่อทำงานร่วมกับ API หรือการประมวลผลข้อมูล

4. การใช้ Modifiers .number

.number ใช้แปลงค่าที่รับมาเป็นตัวเลขโดยอัตโนมัติ

ตัวอย่าง:
<div x-data="{ age: 0 }">
    <label for="age">Age:</label>
    <input type="text" id="age" x-model.number="age">
    <p x-text="`Your age is: ${age}`"></p>
</div>

คำอธิบาย:

  • x-model.number="age" แปลงค่าจากอินพุตเป็นตัวเลข
  • หากผู้ใช้ป้อน “30”, ค่าใน age จะถูกเก็บเป็นตัวเลข 30 แทนข้อความ “30”

5. การใช้ Modifiers .trim

.trim ใช้เพื่อตัดช่องว่างหน้าและหลังข้อความก่อนอัปเดตค่าใน State

ตัวอย่าง:
<div x-data="{ username: '' }">
    <label for="username">Username:</label>
    <input type="text" id="username" x-model.trim="username">
    <p x-text="`Your username: '${username}'`"></p>
</div>

คำอธิบาย:

  • หากผู้ใช้ป้อน ” John ” (มีช่องว่างหน้าและหลัง), username จะถูกเก็บเป็น “John”
  • ช่วยลดข้อผิดพลาดจากการป้อนข้อมูลที่ไม่ต้องการ

6. การใช้ Modifiers ร่วมกัน

สามารถใช้ Modifiers หลายตัวพร้อมกันเพื่อควบคุมพฤติกรรมได้

ตัวอย่าง:
<div x-data="{ price: 0 }">
    <label for="price">Price:</label>
    <input type="text" id="price" x-model.lazy.number.trim="price">
    <p x-text="`Price: $${price}`"></p>
</div>

คำอธิบาย:

  • .lazy: อัปเดตค่าเมื่ออินพุตเสียโฟกัส
  • .number: แปลงค่าเป็นตัวเลข
  • .trim: ตัดช่องว่างออกก่อนอัปเดตค่า

7. การประยุกต์ใช้ Modifiers ในสถานการณ์จริง

ตัวอย่าง: ฟิลด์ค้นหาพร้อมหน่วงเวลา
<div x-data="{ query: '', results: [] }">
    <label for="search">Search:</label>
    <input type="text" id="search" x-model.debounce.300ms="query" @input="fetchResults()">
    <ul>
        <template x-for="result in results" :key="result.id">
            <li x-text="result.name"></li>
        </template>
    </ul>
</div>

<script>
    function fetchResults() {
        // สมมุติว่าค้นหาข้อมูลและอัปเดต `results`
    }
</script>

คำอธิบาย:

  • x-model.debounce.300ms ลดการค้นหาข้อมูลขณะผู้ใช้พิมพ์
  • อัปเดตผลลัพธ์เฉพาะเมื่อผู้ใช้หยุดพิมพ์ 300 มิลลิวินาที

8. ข้อควรระวังในการใช้ Modifiers

  1. การใช้ .lazy:
    • ไม่เหมาะกับสถานการณ์ที่ต้องการอัปเดต State ทันที เช่น การแสดงผลแบบเรียลไทม์
  2. การใช้ .debounce:
    • หากหน่วงเวลามากเกินไป อาจทำให้ผู้ใช้รู้สึกว่าระบบตอบสนองช้า
  3. การใช้ .number:
    • ควรตรวจสอบว่าค่าที่แปลงเป็นตัวเลขนั้นเหมาะสมและไม่เกิดข้อผิดพลาด
  4. การใช้ .trim:
    • เหมาะสำหรับการป้อนข้อมูลที่ต้องการความถูกต้อง เช่น ชื่อหรืออีเมล

สรุป

ในบทนี้ คุณได้เรียนรู้การใช้ Modifiers กับ x-model เช่น .lazy, .debounce, .number, และ .trim เพื่อควบคุมพฤติกรรมการผูกค่า ตัวอย่างการใช้งานแสดงถึงความยืดหยุ่นของ Modifiers ในการจัดการข้อมูลในฟอร์ม ในบทถัดไป เราจะพูดถึงการใช้ x-effect เพื่อจัดการค่าใน State แบบ Reactive!