Dev to webs {Coding…}

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

บทที่ 12: การจัดการ State ของ Component – เทคนิคการจัดการ State

รายละเอียด

State ใน Livewire หมายถึงสถานะของข้อมูลที่เก็บอยู่ใน Component และมีผลต่อการแสดงผลใน UI การจัดการ State อย่างมีประสิทธิภาพมีความสำคัญในการพัฒนา Web Application ที่ต้องการการโต้ตอบแบบ Real-Time เช่น การจัดการฟอร์ม การเปลี่ยนแปลงรายการ หรือการควบคุมสถานะของ UI เช่น Modal, Tabs หรือ Pagination

การจัดการ State ใน Livewire ใช้ตัวแปรภายใน Component และสามารถควบคุมผ่านฟังก์ชันที่กำหนดเองได้ Livewire มีคุณสมบัติที่ช่วยให้การจัดการ State ง่ายขึ้น เช่น Two-Way Data Binding, Event Handling, และ Lifecycle Hook ที่ช่วยจัดการการเปลี่ยนแปลง State และการแสดงผลใน UI


เทคนิคการจัดการ State ของ Component

  1. ใช้ตัวแปรใน Component ตัวแปรใน Livewire Component เป็นวิธีหลักในการเก็บและจัดการ State เช่น:
public $count = 0;

ตัวแปรนี้จะเชื่อมโยงกับ UI และเปลี่ยนแปลงได้ผ่านการโต้ตอบของผู้ใช้

Two-Way Data Binding ใช้ wire:model เพื่อเชื่อมโยงตัวแปรกับฟิลด์ในฟอร์มแบบ Two-Way Data Binding:

<input type="text" wire:model="name">

เมื่อผู้ใช้แก้ไขฟิลด์ ตัวแปร $name ใน Component จะเปลี่ยนแปลงทันที

Event Handling ใช้ Event เพื่อจัดการ State ระหว่างการโต้ตอบ:

public function toggleActive()
{
    $this->isActive = !$this->isActive;
}

ใน View:

<button wire:click="toggleActive">
    {{ $isActive ? 'Deactivate' : 'Activate' }}
</button>

Lifecycle Hook ใช้ Lifecycle Hook เช่น mount, updated, หรือ render เพื่อควบคุมการเปลี่ยนแปลงของ State ในช่วงเวลาที่เหมาะสม:

public function updatedName($value)
{
    $this->name = strtoupper($value); // เปลี่ยนข้อความเป็นตัวพิมพ์ใหญ่
}

การใช้ Computed Property ใช้ Property ที่คำนวณค่าได้อัตโนมัติจาก State อื่น ๆ:

public function getFormattedNameProperty()
{
    return ucfirst($this->name);
}

ใน View:

<p>{{ $this->formattedName }}</p>

ตัวอย่างการใช้งาน State

สร้าง Counter Component เราจะสร้าง Counter Component ที่มีปุ่มเพิ่มและลดค่าตัวแปร $count และมีข้อความแสดงสถานะ (Odd หรือ Even)

สร้าง Component

php artisan make:livewire Counter

จัดการ State ใน Component (Counter.php)

<?php

namespace App\Http\Livewire;

use Livewire\Component;

class Counter extends Component
{
    public $count = 0;

    public function increment()
    {
        $this->count++;
    }

    public function decrement()
    {
        $this->count--;
    }

    public function getIsEvenProperty()
    {
        return $this->count % 2 === 0;
    }

    public function render()
    {
        return view('livewire.counter');
    }
}

สร้าง UI ใน Blade View (counter.blade.php)

<div>
    <h1>Count: {{ $count }}</h1>
    <button wire:click="increment">+</button>
    <button wire:click="decrement">-</button>
    <p>Status: {{ $this->isEven ? 'Even' : 'Odd' }}</p>
</div>

การแสดงผลใน Blade Template เพิ่ม Component ในหน้า home.blade.php:

@livewire('counter')

  1. ผลลัพธ์ที่ได้
    • เมื่อผู้ใช้คลิกปุ่ม + หรือ - ค่าของ $count จะเปลี่ยนแปลงแบบ Real-Time
    • UI จะแสดงสถานะ Odd หรือ Even ตามค่าปัจจุบันของ $count

เทคนิคเพิ่มเติมในการจัดการ State

  • การรีเซ็ต State: ใช้ $this->reset() หรือ $this->reset(['var1', 'var2']) เพื่อคืนค่าตัวแปรกลับสู่ค่าเริ่มต้น
  • การกำหนดค่าผ่าน URL: ใช้ queryString เพื่อกำหนดค่า State ผ่าน URL เช่น การจัดการ Pagination
  • การใช้ Session: ใช้ session()->put() และ session()->get() เพื่อเก็บ State ข้ามหน้า

การนำไปใช้งาน

  • การจัดการสถานะของฟอร์ม เช่น การบันทึก/ยกเลิก
  • การสร้าง UI แบบ Interactive เช่น Modal, Tabs, หรือ Slider
  • การพัฒนาระบบที่ต้องการการอัปเดตแบบ Real-Time เช่น Dashboard หรือ Chart

ประโยชน์ของการจัดการ State ด้วย Livewire

  • ลดการใช้ JavaScript สำหรับการควบคุม State
  • ทำให้โค้ดมีความกระชับและเข้าใจง่าย
  • ช่วยให้การพัฒนาแอปพลิเคชันที่ต้องการการโต้ตอบแบบ Real-Time ทำได้รวดเร็ว