Dev to webs {Coding…}

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

บทที่ 15: การใช้ Key ใน x-for


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

Key เป็นคุณสมบัติที่ใช้ใน x-for เพื่อบอก Alpine.js ว่าจะต้องเชื่อมโยงองค์ประกอบ (Element) กับข้อมูลในลิสต์อย่างไร เมื่อมีการเปลี่ยนแปลงข้อมูล เช่น เพิ่ม, ลบ หรืออัปเดตรายการในลิสต์

  • Key มีบทบาทสำคัญในการช่วยลด การ Render ซ้ำ และปรับปรุงประสิทธิภาพการทำงาน
  • Alpine.js จะใช้ Key เพื่อระบุองค์ประกอบใน DOM และหลีกเลี่ยงการสร้าง Element ใหม่เมื่อไม่จำเป็น

โครงสร้างพื้นฐาน:

<template x-for="(item, index) in items" :key="item.id">
    <element x-text="item.name"></element>
</template>


2. เหตุผลที่ต้องใช้ Key

  1. ลดการ Render ซ้ำ:
    • หากไม่มี Key, Alpine.js จะลบและสร้าง Element ใหม่ทั้งหมดในลิสต์ทุกครั้งที่ข้อมูลเปลี่ยน
  2. รักษาสถานะของ Element:
    • เช่น Input ที่มีค่าที่พิมพ์อยู่จะไม่สูญหายหากใช้ Key ที่ถูกต้อง
  3. ปรับปรุงประสิทธิภาพ:
    • ใช้ Key เพื่อให้ Alpine.js อัปเดตเฉพาะ Element ที่มีการเปลี่ยนแปลง

3. ตัวอย่างการใช้ Key

ตัวอย่าง: ใช้ Key จาก id
<div x-data="{ items: [{ id: 1, name: 'Apple' }, { id: 2, name: 'Banana' }, { id: 3, name: 'Cherry' }] }">
    <ul>
        <template x-for="item in items" :key="item.id">
            <li x-text="item.name"></li>
        </template>
    </ul>
</div>

คำอธิบาย:

  • ใช้ :key="item.id" เพื่อระบุว่าข้อมูลในลิสต์แยกกันด้วย id
  • แสดงผล: - Apple - Banana - Cherry

4. การใช้ Key กับ Index

หากไม่มีข้อมูลที่มี Key เฉพาะ เช่น id สามารถใช้ Index เป็น Key ได้:

ตัวอย่าง:
<div x-data="{ items: ['Apple', 'Banana', 'Cherry'] }">
    <ul>
        <template x-for="(item, index) in items" :key="index">
            <li x-text="`${index + 1}: ${item}`"></li>
        </template>
    </ul>
</div>

คำอธิบาย:

  • ใช้ :key="index" เพื่อระบุตำแหน่งของ Element
  • แสดงผล: 1: Apple 2: Banana 3: Cherry

5. การเปรียบเทียบ: มี Key กับไม่มี Key

ไม่มี Key:
<div x-data="{ items: ['Apple', 'Banana', 'Cherry'] }">
    <ul>
        <template x-for="item in items">
            <li x-text="item"></li>
        </template>
    </ul>
</div>

  • เมื่อมีการเพิ่ม/ลบรายการใหม่ Alpine.js อาจลบและสร้าง Element ใหม่ทั้งหมด
  • ผลกระทบ: ประสิทธิภาพต่ำ และสถานะของ Element เช่น Input อาจสูญหาย
มี Key:
<div x-data="{ items: ['Apple', 'Banana', 'Cherry'] }">
    <ul>
        <template x-for="(item, index) in items" :key="index">
            <li x-text="item"></li>
        </template>
    </ul>
</div>

  • Alpine.js จะอัปเดตเฉพาะ Element ที่เปลี่ยนแปลง
  • ประสิทธิภาพดีขึ้น

6. การใช้ Key ในการประยุกต์ใช้งานจริง

ตัวอย่าง: การลบรายการ
<div x-data="{ items: [{ id: 1, name: 'Apple' }, { id: 2, name: 'Banana' }, { id: 3, name: 'Cherry' }] }">
    <ul>
        <template x-for="item in items" :key="item.id">
            <li>
                <span x-text="item.name"></span>
                <button @click="items = items.filter(i => i.id !== item.id)">Delete</button>
            </li>
        </template>
    </ul>
</div>

คำอธิบาย:

  • เมื่อคลิกปุ่ม Delete, รายการจะถูกลบออกจากลิสต์
  • Key item.id ช่วยให้ Alpine.js ลบเฉพาะ Element ที่เกี่ยวข้อง

7. ข้อควรระวัง

  1. อย่าใช้ Key ซ้ำ:
    • Key ควรเป็นเอกลักษณ์สำหรับแต่ละ Element
  2. อย่าใช้ Index หากข้อมูลเปลี่ยนแปลงตำแหน่งบ่อย:
    • การใช้ Index อาจทำให้ Alpine.js อัปเดตผิดพลาดหากข้อมูลเรียงลำดับใหม่

สรุป

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับการใช้ Key ใน x-for เพื่อปรับปรุงประสิทธิภาพการ Render และรักษาสถานะของ Element ตัวอย่างการใช้งานจริงแสดงให้เห็นถึงความสำคัญของ Key ในการจัดการลิสต์ข้อมูลที่เปลี่ยนแปลง ในบทถัดไป เราจะพูดถึงการจัดการฟอร์มและการผูกค่าด้วย x-model!