Dev to webs {Coding…}

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

บทที่ 25: การใช้ x-ref


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

x-ref เป็นคำสั่งใน Alpine.js ที่ช่วยให้คุณสามารถอ้างอิง DOM ภายใน Component ได้อย่างสะดวก

  • ใช้เพื่อเข้าถึง Element HTML โดยตรงในโค้ด JavaScript
  • เหมาะสำหรับการจัดการ DOM เช่น การตั้งค่า Focus, การเลื่อนตำแหน่ง Scroll, หรือการดึงค่าของอินพุต

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

<div x-data="{ functionOrAction() { console.log($refs.elementName); } }">
    <input x-ref="elementName">
    <button @click="functionOrAction()">Click Me</button>
</div>


2. การใช้งาน x-ref เบื้องต้น

ตัวอย่าง 1: อ้างอิง DOM และตั้งค่า Focus
<div x-data>
    <input type="text" x-ref="myInput" placeholder="Type something...">
    <button @click="$refs.myInput.focus()">Focus Input</button>
</div>

คำอธิบาย:

  • x-ref="myInput" สร้างอ้างอิงสำหรับ <input>
  • เมื่อคลิกปุ่ม, คำสั่ง $refs.myInput.focus() จะตั้งค่า Focus ให้กับ <input>

3. การใช้ x-ref กับฟังก์ชัน

ตัวอย่าง 2: การดึงค่าอินพุต
<div x-data="{ getInputValue() { alert($refs.myInput.value); } }">
    <input type="text" x-ref="myInput" placeholder="Enter text">
    <button @click="getInputValue()">Get Input Value</button>
</div>

คำอธิบาย:

  • ฟังก์ชัน getInputValue() ใช้ $refs.myInput.value เพื่อดึงค่าจาก <input> และแสดงใน Alert

4. การใช้ x-ref กับ Element หลายตัว

ตัวอย่าง 3: เลื่อน Scroll ไปยัง Element ที่กำหนด
<div x-data>
    <div style="height: 100px; overflow-y: auto; border: 1px solid;">
        <p>Item 1</p>
        <p>Item 2</p>
        <p x-ref="target">Target Item</p>
        <p>Item 4</p>
        <p>Item 5</p>
    </div>
    <button @click="$refs.target.scrollIntoView({ behavior: 'smooth' })">Scroll to Target</button>
</div>

คำอธิบาย:

  • x-ref="target" อ้างอิง <p> ที่ต้องการเลื่อน Scroll ไปยังตำแหน่งนั้น
  • scrollIntoView({ behavior: 'smooth' }) ใช้เลื่อนแบบนุ่มนวลไปยัง Element ที่อ้างอิง

5. การใช้ x-ref ร่วมกับการตั้งค่า Style

ตัวอย่าง 4: เปลี่ยนสี Background ของ Element
<div x-data="{ changeColor() { $refs.box.style.backgroundColor = 'lightblue'; } }">
    <div x-ref="box" style="width: 100px; height: 100px; background: lightgray;"></div>
    <button @click="changeColor()">Change Color</button>
</div>

คำอธิบาย:

  • ฟังก์ชัน changeColor() ใช้ $refs.box.style.backgroundColor เพื่อเปลี่ยนสีของ <div>

6. การใช้ x-ref ใน Form

ตัวอย่าง 5: รีเซ็ตค่าฟอร์ม
<div x-data="{ resetForm() { $refs.myForm.reset(); } }">
    <form x-ref="myForm">
        <input type="text" placeholder="Name">
        <input type="email" placeholder="Email">
        <button type="button" @click="resetForm()">Reset</button>
    </form>
</div>

คำอธิบาย:

  • ฟังก์ชัน resetForm() ใช้ $refs.myForm.reset() เพื่อรีเซ็ตค่าทั้งหมดในฟอร์ม

7. การใช้ x-ref กับ Transition

ตัวอย่าง 6: ซ่อนและแสดง Element ด้วย Transition
<div x-data="{ toggleVisibility() { $refs.box.style.display = $refs.box.style.display === 'none' ? 'block' : 'none'; } }">
    <div x-ref="box" style="width: 100px; height: 100px; background: lightcoral;"></div>
    <button @click="toggleVisibility()">Toggle Visibility</button>
</div>

คำอธิบาย:

  • ฟังก์ชัน toggleVisibility() ใช้ $refs.box.style.display เพื่อสลับการแสดงผลของ <div>

8. การใช้งาน x-ref ร่วมกับ x-init

ตัวอย่าง 7: ตั้งค่าคุณสมบัติตอนเริ่มต้น
<div x-data x-init="$refs.myDiv.textContent = 'Initialized Content';">
    <div x-ref="myDiv" style="padding: 10px; background: lightyellow;"></div>
</div>

คำอธิบาย:

  • x-init ใช้ $refs.myDiv.textContent เพื่อกำหนดข้อความใน <div> ตอนเริ่มต้น

9. ข้อควรระวังในการใช้ x-ref

  1. การอ้างอิงผิดตำแหน่ง:
    • ต้องแน่ใจว่า $refs อ้างอิง Element ที่อยู่ในขอบเขตของ x-data เท่านั้น
  2. การจัดการ DOM โดยตรง:
    • ใช้ x-ref อย่างระมัดระวังเพื่อหลีกเลี่ยงการจัดการ DOM ซ้ำซ้อน
  3. ไม่สามารถใช้ข้าม Component:
    • $refs สามารถอ้างอิง Element ได้เฉพาะใน Component ปัจจุบันเท่านั้น

สรุป

ในบทนี้ คุณได้เรียนรู้การใช้ x-ref เพื่ออ้างอิง DOM ภายใน Component และการใช้งานในสถานการณ์ต่าง ๆ เช่น การตั้งค่า Focus, การดึงค่าจากอินพุต, การเลื่อน Scroll, และการเปลี่ยนแปลง Style โดย x-ref ช่วยให้การจัดการ DOM ง่ายและมีประสิทธิภาพมากขึ้น ในบทถัดไป เราจะเรียนรู้เกี่ยวกับการจัดการฟอร์มซับซ้อนด้วย Alpine.js!