Dev to webs {Coding…}

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

บทที่ 37: การเชื่อมต่อกับ Local Storage


1. ความเข้าใจเกี่ยวกับ Local Storage

Local Storage เป็นพื้นที่เก็บข้อมูลของเบราว์เซอร์ที่สามารถใช้เก็บค่าหรือ State แบบถาวรสำหรับผู้ใช้งาน

  • ข้อมูลที่เก็บใน Local Storage จะไม่สูญหายเมื่อปิดหรือโหลดหน้าเว็บใหม่
  • เหมาะสำหรับการจัดเก็บข้อมูล เช่น ธีม, รายการที่ค้างอยู่, หรือ การตั้งค่าผู้ใช้

2. การเชื่อมต่อ Alpine.js กับ Local Storage

คุณสามารถใช้ Local Storage เพื่อจัดการ State ใน Alpine.js โดยการอ่านและเขียนข้อมูลผ่านฟังก์ชัน JavaScript เช่น localStorage.getItem() และ localStorage.setItem()


3. การจัดเก็บและโหลดข้อมูลด้วย Local Storage

ตัวอย่าง 1: จัดเก็บและโหลด State
<div x-data="{ 
        theme: localStorage.getItem('theme') || 'light',
        toggleTheme() {
            this.theme = this.theme === 'light' ? 'dark' : 'light';
            localStorage.setItem('theme', this.theme);
        } 
}">
    <p>Current Theme: <span x-text="theme"></span></p>
    <button @click="toggleTheme()">Toggle Theme</button>
</div>

คำอธิบาย:

  • localStorage.getItem('theme') โหลดค่าที่เก็บไว้ใน Local Storage หรือใช้ค่าเริ่มต้นเป็น 'light'
  • localStorage.setItem('theme', this.theme) อัปเดตค่าใน Local Storage เมื่อเปลี่ยนธีม

4. การใช้งาน Local Storage กับ State หลายตัว

ตัวอย่าง 2: จัดการหลายค่าด้วย Local Storage
<div x-data="{ 
        name: localStorage.getItem('name') || '', 
        age: localStorage.getItem('age') || '', 
        saveData() {
            localStorage.setItem('name', this.name);
            localStorage.setItem('age', this.age);
        }
}">
    <label>
        Name: <input type="text" x-model="name">
    </label>
    <label>
        Age: <input type="number" x-model="age">
    </label>
    <button @click="saveData()">Save</button>
    <p>Saved Name: <span x-text="localStorage.getItem('name')"></span></p>
    <p>Saved Age: <span x-text="localStorage.getItem('age')"></span></p>
</div>

คำอธิบาย:

  • ใช้ Local Storage เก็บค่าของ name และ age เมื่อผู้ใช้คลิกปุ่ม Save
  • แสดงค่าที่เก็บไว้ใน Local Storage บนหน้าเว็บ

5. การเชื่อมต่อกับ Local Storage แบบ Reactive

ตัวอย่าง 3: ใช้ $watch เพื่อตรวจจับและอัปเดต Local Storage
<div x-data="{ 
        tasks: JSON.parse(localStorage.getItem('tasks')) || [], 
        newTask: '', 
        addTask() {
            this.tasks.push(this.newTask);
            this.newTask = '';
        } 
}" 
x-init="$watch('tasks', value => localStorage.setItem('tasks', JSON.stringify(value)))">
    <input type="text" x-model="newTask" placeholder="New Task">
    <button @click="addTask()">Add Task</button>
    <ul>
        <template x-for="task in tasks" :key="task">
            <li x-text="task"></li>
        </template>
    </ul>
</div>

คำอธิบาย:

  • ใช้ JSON.parse() และ JSON.stringify() สำหรับจัดการข้อมูล Array กับ Local Storage
  • $watch('tasks') ตรวจจับการเปลี่ยนแปลงใน State tasks และอัปเดต Local Storage อัตโนมัติ

6. การลบข้อมูลใน Local Storage

ตัวอย่าง 4: ลบค่าใน Local Storage
<div x-data="{ 
        name: localStorage.getItem('name') || '', 
        clearData() {
            localStorage.removeItem('name');
            this.name = '';
        }
}">
    <label>
        Name: <input type="text" x-model="name">
    </label>
    <button @click="clearData()">Clear Name</button>
    <p>Saved Name: <span x-text="localStorage.getItem('name') || 'No Name Saved'"></span></p>
</div>

คำอธิบาย:

  • ใช้ localStorage.removeItem('name') เพื่อลบข้อมูลใน Local Storage
  • อัปเดต State name หลังจากลบค่า

7. การใช้ Local Storage เก็บข้อมูลแบบซ้อนลึก

ตัวอย่าง 5: จัดการข้อมูลแบบ Object
<div x-data="{ 
        settings: JSON.parse(localStorage.getItem('settings')) || { theme: 'light', notifications: true }, 
        saveSettings() {
            localStorage.setItem('settings', JSON.stringify(this.settings));
        }
}">
    <label>
        Theme:
        <select x-model="settings.theme">
            <option value="light">Light</option>
            <option value="dark">Dark</option>
        </select>
    </label>
    <label>
        Notifications:
        <input type="checkbox" x-model="settings.notifications">
    </label>
    <button @click="saveSettings()">Save Settings</button>
    <p>Saved Theme: <span x-text="settings.theme"></span></p>
    <p>Notifications Enabled: <span x-text="settings.notifications ? 'Yes' : 'No'"></span></p>
</div>

คำอธิบาย:

  • ใช้ Local Storage เก็บ Object settings และอัปเดตค่าผ่าน JSON.stringify() และ JSON.parse()

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

  1. การเก็บข้อมูลที่ซับซ้อน:
    • ควรใช้ JSON.stringify() และ JSON.parse() สำหรับข้อมูลประเภท Object หรือ Array
  2. การเก็บข้อมูลส่วนตัว:
    • หลีกเลี่ยงการเก็บข้อมูลสำคัญ เช่น รหัสผ่าน หรือข้อมูลผู้ใช้ที่ต้องการความปลอดภัย
  3. ความเข้ากันได้ของเบราว์เซอร์:
    • Local Storage ใช้งานได้ในเบราว์เซอร์สมัยใหม่ แต่ควรตรวจสอบความเข้ากันได้ในเบราว์เซอร์เป้าหมาย

สรุป

ในบทนี้ คุณได้เรียนรู้การเชื่อมต่อและจัดการ State ด้วย Local Storage ใน Alpine.js ตัวอย่างครอบคลุมการจัดเก็บและโหลดข้อมูล การเชื่อมโยง State แบบ Reactive และการจัดการข้อมูลซ้อนลึก Local Storage ช่วยให้ข้อมูลของผู้ใช้ถูกเก็บรักษาแม้จะโหลดหน้าเว็บใหม่ ทำให้เว็บไซต์ของคุณมีความยืดหยุ่นและประสบการณ์ที่ดีขึ้นสำหรับผู้ใช้งาน!