0Pricing
React Academy · บทเรียน

สร้างฟีดการแจ้งเตือนแบบเรียลไทม์

ผสาน SSE เข้ากับสถานะของรีแอ็กต์เพื่อสร้างฟีดการแจ้งเตือนที่อัปเดตแบบเรียลไทม์โดยไม่ต้องให้ผู้ใช้โต้ตอบ

สร้างฟีดการแจ้งเตือนแบบเรียลไทม์ เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

สถาปัตยกรรมรายการการแจ้งเตือน

รายการการแจ้งเตือนแบบเรียลไทม์ประกอบด้วยกระแสข้อมูล SSE สำหรับการรับการแจ้งเตือนใหม่ และจุดเชื่อมต่อ REST สำหรับทำเครื่องหมายรายการว่าอ่านแล้ว ส่วนประกอบจะรักษาสถานะภายในสำหรับรายการการแจ้งเตือน สมัครรับกระแสข้อมูลจากเซิร์ฟเวอร์ผ่าน EventSource ใน useEffect และจัดการการโต้ตอบของผู้ใช้ (ทำเครื่องหมายว่าอ่านแล้ว ปิดทิ้ง) ด้วยการอัปเดตเชิงคาดการณ์

รูปแบบข้อมูลการแจ้งเตือน

ออบเจ็กต์การแจ้งเตือนมักมีรูปแบบดังนี้: { id: string, type: 'info' | 'warning' | 'success', message: string, timestamp: string, read: boolean } ช่อง type ใช้กำหนดไอคอนและสี ช่อง read ติดตามว่าผู้ใช้รับทราบการแจ้งเตือนแล้วหรือไม่ ส่วน timestamp ช่วยให้จัดกลุ่มตามช่วงเวลาได้

การสมัครรับกระแสข้อมูล SSE

ใน useEffect ให้สร้าง EventSource ที่เชื่อมต่อกับ /api/notifications/stream เมื่อเกิดเหตุการณ์ข้อความแต่ละครั้ง ให้แยกวิเคราะห์ JSON แล้วเพิ่มการแจ้งเตือนใหม่ไว้ด้านหน้าสถานะ: setNotifications(prev => [JSON.parse(e.data), ...prev]) การเพิ่มไว้ด้านหน้า (พฤติกรรมแบบ unshift) จะวางการแจ้งเตือนล่าสุดไว้ด้านบน ซึ่งเป็นรูปแบบมาตรฐานของรายการการแจ้งเตือน

ป้ายจำนวนที่ยังไม่ได้อ่าน

คำนวณจำนวนที่ยังไม่ได้อ่านจากอาร์เรย์การแจ้งเตือนโดยไม่ต้องมีสถานะเพิ่มเติม: const unreadCount = notifications.filter(n => !n.read).length แสดงจำนวนนี้เป็นป้ายบนไอคอนกระดิ่งการแจ้งเตือน จำนวนจะอัปเดตโดยอัตโนมัติทุกครั้งที่สถานะการแจ้งเตือนเปลี่ยนแปลง จึงไม่จำเป็นต้องจัดการสถานะแยกต่างหาก

การทำเครื่องหมายว่าอ่านแล้วด้วยการอัปเดตเชิงคาดการณ์

เมื่อผู้ใช้คลิกการแจ้งเตือน ให้ใช้การอัปเดตว่าอ่านแล้วเชิงคาดการณ์ทันที: setNotifications(prev => prev.map(n => n.id === id ? { ...n, read: true } : n)) จากนั้นส่งคำขอ PATCH ไปยัง /api/notifications/:id พร้อมข้อมูล { read: true } ในเบื้องหลัง หากคำขอล้มเหลว ให้ย้อนกลับการอัปเดตเชิงคาดการณ์

การจัดกลุ่มการแจ้งเตือนตามเวลา

จัดกลุ่มการแจ้งเตือนเพื่อแสดงผลเป็น “วันนี้” (วันตามปฏิทินเดียวกัน), “เมื่อวาน” และ “เก่ากว่านั้น” คำนวณกลุ่มโดยใช้เวลาของการแจ้งเตือนและวันที่ปัจจุบัน: const today = new Date().toDateString() แสดงแต่ละกลุ่มเป็นส่วนแยกกันพร้อมป้ายหัวข้อ วิธีนี้ช่วยให้กวาดดูรายการการแจ้งเตือนที่ยาวได้ง่ายขึ้นมาก

การแจ้งเตือนแบบป๊อปอัปสำหรับกิจกรรมเบื้องหลัง

เมื่อผู้ใช้อยู่คนละหน้าและมีการแจ้งเตือนใหม่เข้ามาผ่าน SSE ให้แสดงการแจ้งเตือนแบบป๊อปอัปแทนการอัปเดตรายการการแจ้งเตือน หรือแสดงควบคู่กันไป ใช้บริบทการแจ้งเตือนส่วนกลางหรือที่เก็บ Zustand ซึ่งทั้งตัวรับการแจ้งเตือน SSE และตัวแสดงการแจ้งเตือนแบบป๊อปอัปเข้าถึงได้ การแจ้งเตือนแบบป๊อปอัปจะหายไปหลังจากไม่กี่วินาที ส่วนการแจ้งเตือนจะยังคงอยู่ในรายการ

บริบทการแจ้งเตือนส่วนกลาง

สำหรับการแจ้งเตือนที่ปรากฏทั่วทั้งแอป ให้จัดเก็บไว้ในบริบท React หรือที่เก็บ Zustand ที่ระดับรากของแอป การสมัครรับ SSE อยู่ในส่วนประกอบผู้ให้บริการใกล้ด้านบนของโครงสร้าง ส่วนประกอบใด ๆ ก็สามารถอ่านการแจ้งเตือนหรือส่งการแจ้งเตือนใหม่ผ่านที่เก็บร่วมกันได้ ทำให้แสดงการแจ้งเตือนแบบป๊อปอัปจากหน้าใดก็ได้

การเชื่อมต่อ SSE ใหม่เมื่อแท็บกลับมาใช้งาน

EventSource จัดการการเชื่อมต่อใหม่โดยอัตโนมัติเมื่อเครือข่ายขาดหาย แต่การเปลี่ยนการมองเห็นแท็บเป็นอีกกรณีหนึ่ง เมื่อผู้ใช้กลับมายังแท็บหลังจากไม่ได้ใช้งานเป็นเวลานาน การเชื่อมต่อ SSE อาจถูกเซิร์ฟเวอร์ยุติ EventSource จะเชื่อมต่อใหม่โดยอัตโนมัติ และกลไก Last-Event-ID จะเล่นการแจ้งเตือนที่ผู้ใช้พลาดไปขณะที่แท็บทำงานอยู่เบื้องหลัง

การคงการแจ้งเตือนไว้ระหว่างการเปลี่ยนหน้า

แอปพลิเคชันหน้าเดียวจะสูญเสียสถานะการแจ้งเตือนในหน่วยความจำเมื่อเปลี่ยนออกจากหน้า จัดเก็บการแจ้งเตือนไว้ใน localStorage หลังการอัปเดตแต่ละครั้ง: localStorage.setItem('notifications', JSON.stringify(notifications)) เมื่อส่วนประกอบเริ่มทำงาน ให้ตั้งต้นสถานะจาก localStorage ก่อนเชื่อมต่อกระแสข้อมูล SSE วิธีนี้จะรักษาประวัติการแจ้งเตือนไว้ระหว่างการเปลี่ยนหน้า

รูปแบบจุดเชื่อมต่อ SSE

จุดเชื่อมต่อ SSE ฝั่งเซิร์ฟเวอร์ต้องกำหนดส่วนหัวเฉพาะดังนี้: Content-Type: text/event-stream, Cache-Control: no-cache และ Connection: keep-alive ใน Express/NestJS ให้เขียนเหตุการณ์ในรูปแบบ data: ${JSON.stringify(payload)}\n\n — โปรดสังเกตบรรทัดใหม่สองบรรทัดที่ส่งสัญญาณว่าเหตุการณ์สิ้นสุด เซิร์ฟเวอร์ต้องล้างบัฟเฟอร์หลังการเขียนแต่ละครั้ง เพื่อให้เบราว์เซอร์ได้รับเหตุการณ์ทันที

รูปแบบจุดเชื่อมต่อกระแสข้อมูล SSE

ส่วนหัว Content-Type ที่ถูกต้องสำหรับจุดเชื่อมต่อ SSE (เหตุการณ์ที่เซิร์ฟเวอร์ส่ง) คืออะไร

ทบทวนบทเรียน: รายการการแจ้งเตือนแบบเรียลไทม์

รายการการแจ้งเตือนประกอบด้วยการสมัครรับ SSE (useEffect พร้อมการล้าง EventSource) และการเปลี่ยนแปลงผ่าน REST (PATCH สำหรับทำเครื่องหมายว่าอ่านแล้ว) รูปแบบข้อมูล: {รหัส, ประเภท, ข้อความ, เวลา, อ่านแล้ว} คำนวณ unreadCount ด้วย filter และจัดกลุ่มเป็นวันนี้/เมื่อวาน/เก่ากว่านั้นเพื่อแสดงผล ใช้บริบทส่วนกลางหรือ Zustand สำหรับการแจ้งเตือนแบบป๊อปอัปข้ามหน้า จัดเก็บไว้ใน localStorage เพื่อให้ยังคงอยู่ระหว่างการเปลี่ยนหน้า จุดเชื่อมต่อ SSE ต้องใช้ Content-Type: text/event-stream, Cache-Control: no-cache และตัวคั่นเหตุการณ์ด้วยบรรทัดใหม่สองบรรทัด

คำถามที่พบบ่อย

บทเรียน “สร้างฟีดการแจ้งเตือนแบบเรียลไทม์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “สร้างฟีดการแจ้งเตือนแบบเรียลไทม์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “สร้างฟีดการแจ้งเตือนแบบเรียลไทม์”

ผสาน SSE เข้ากับสถานะของรีแอ็กต์เพื่อสร้างฟีดการแจ้งเตือนที่อัปเดตแบบเรียลไทม์โดยไม่ต้องให้ผู้ใช้โต้ตอบ คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “สร้างฟีดการแจ้งเตือนแบบเรียลไทม์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเปรียบเทียบ SSE กับ WebSockets และการสำรวจเป็นระยะ
  2. การใช้สตรีม SSE ใน React ด้วย EventSource
  3. รูปแบบการสำรวจแบบต่อเนื่องและตรรกะการเชื่อมต่อใหม่
  4. สร้างฟีดการแจ้งเตือนแบบเรียลไทม์
← กลับไปที่ React Academy