N

Nokfa Docs

Current: framework-next.js

ไม่มีชื่อบทความ

📡 ดึงข้อมูลแบบ Real‑time ด้วย onSnapshot และ useEffect

🔄 หลักการของ Snapshot Listener

onSnapshot() เป็นฟังก์ชันของ Firestore ที่จะ ฟังการเปลี่ยนแปลงของเอกสาร/คอลเลกชันแบบเรียลไทม์

  • เมื่อมีการเพิ่ม/แก้ไข/ลบ เอกสารในคอลเลกชัน → ข้อมูลใน UI จะอัปเดตทันที
import { onSnapshot, collection } from 'firebase/firestore';

📦 ตัวอย่างการใช้งานใน Client Component

'use client';
import { useEffect, useState } from 'react';
import { db } from '@/lib/firebaseClient';
import { collection, onSnapshot, query, orderBy, limit } from 'firebase/firestore';

export default function RealTimeMessages() {
  const [messages, setMessages] = useState([]);

  useEffect(() => {
    const q = query(collection(db, 'messages'), orderBy('createdAt', 'desc'), limit(10));
    const unsubscribe = onSnapshot(q, (snapshot) => {
      const docs = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() }));
      setMessages(docs);
    });

    return () => {
      unsubscribe(); // 🧹 cleanup listener ตอน component ถูก unmount
    };
  }, []);

  return (
    <ul>
      {messages.map((msg) => <li key={msg.id}>{msg.text}</li>)}
    </ul>
  );
}

💡 Performance Tips

  • 🧭 orderBy + limit → ช่วยลด load จาก snapshot
  • 🧹 unsubscribe listener ตอน component unmount เพื่อป้องกัน memory leak
  • 🔄 อย่าใช้ onSnapshot ซ้อนซ้อนกันหลายชั้น (แนะนำใช้ useEffect เดียว)
  • ⏱️ หมั่น debounce interaction ที่ trigger update บ่อย เช่น input realtime

🧪 ตัวอย่างการอัปเดตแบบทันที

เมื่อผู้ใช้ A ส่งข้อความใหม่ หรือผู้ดูแลระบบแก้ไขข้อความ → ผู้ใช้ B ที่เปิดหน้าเว็บอยู่จะเห็นข้อมูลใหม่ทันที โดยไม่ต้อง refresh


การใช้ onSnapshot ร่วมกับ useEffect ทำให้ Next.js สามารถแสดงข้อมูลเรียลไทม์จาก Firestore ได้ทันที และควรใช้อย่างระมัดระวังโดยจัดการ lifecycle ของ listener อย่างเหมาะสม เพื่อให้แอปทำงานได้ลื่นและปลอดภัย