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

การใช้ Socket.IO กับ React

เชื่อมต่อ React กับเซิร์ฟเวอร์ Socket.IO รับฟังอีเวนต์ และส่งข้อความจากฮุก

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

เหตุใดจึงต้องใช้ Socket.IO

Socket.IO เพิ่มห้อง เนมสเปซ การเชื่อมต่อใหม่โดยอัตโนมัติ และการส่งข้อความตามเหตุการณ์บน WebSockets พร้อมกลไกสำรองเป็นการสำรวจแบบยาวผ่าน HTTP ทำให้ใช้งานสะดวกกว่า WebSocket โดยตรงมาก

การติดตั้งไคลเอนต์

ติดตั้งแพ็กเกจไคลเอนต์ Socket.IO

npm install socket.io-client

การสร้างอินสแตนซ์ซ็อกเก็ต

เรียกใช้ io(url) นอกคอมโพเนนต์ React เพื่อให้ใช้การเชื่อมต่อร่วมกันและไม่สร้างใหม่ทุกครั้งที่มีการแสดงผล ส่งออกอินสแตนซ์นี้เป็นซิงเกิลตัน

// src/lib/socket.ts
import { io } from 'socket.io-client';

export const socket = io('https://api.example.com', {
  autoConnect: false, // connect manually
  withCredentials: true,
});

การเชื่อมต่อใน useEffect

เชื่อมต่อเมื่อคอมโพเนนต์ถูกเมานต์ และยกเลิกการเชื่อมต่อเมื่อคอมโพเนนต์ถูกถอดออก เพื่อหลีกเลี่ยงการเชื่อมต่อที่ค้างอยู่

useEffect(() => {
  socket.connect();

  return () => {
    socket.disconnect();
  };
}, []);

การรับฟังเหตุการณ์

ใช้ socket.on('event', handler) เพื่อสมัครรับเหตุการณ์ ลบตัวรับฟังในฟังก์ชันล้างข้อมูลเพื่อป้องกันตัวจัดการซ้ำเมื่อแสดงผลใหม่

useEffect(() => {
  function onMessage(data) {
    setMessages(prev => [...prev, data]);
  }

  socket.on('message', onMessage);

  return () => {
    socket.off('message', onMessage);
  };
}, []);

การส่งเหตุการณ์

เรียกใช้ socket.emit('event', data) เพื่อส่งข้อมูลไปยังเซิร์ฟเวอร์ คุณสามารถส่งฟังก์ชันเรียกกลับ (การยืนยันการรับ) เป็นอาร์กิวเมนต์สุดท้ายได้หากต้องการ

function sendMessage(text) {
  socket.emit('message', { text, timestamp: Date.now() }, (ack) => {
    console.log('Server acknowledged:', ack);
  });
}

ฮุก useSocket กำหนดเอง

ห่อหุ้มตรรกะการเชื่อมต่อซ็อกเก็ตไว้ในฮุกกำหนดเอง เพื่อให้นำกลับมาใช้ซ้ำในหลายคอมโพเนนต์ได้

function useSocket(event, handler) {
  useEffect(() => {
    socket.on(event, handler);
    return () => socket.off(event, handler);
  }, [event, handler]);
}

// Usage:
useSocket('message', (data) => setMessages(m => [...m, data]));

ห้องและเนมสเปซ

เข้าร่วมห้องโดยส่งเหตุการณ์เข้าร่วม (ซึ่งจัดการฝั่งเซิร์ฟเวอร์) ใช้เนมสเปซ (io('/chat')) เพื่อแบ่งการรับส่งข้อมูลของซ็อกเก็ตในระดับการเชื่อมต่อ

// Join a room
socket.emit('join-room', 'room-123');

// Connect to a namespace
const chatSocket = io('https://api.example.com/chat');

สถานะการเชื่อมต่อ

ติดตามสถานะการเชื่อมต่อด้วยเหตุการณ์ connect, disconnect และ connect_error

const [isConnected, setIsConnected] = useState(socket.connected);

useEffect(() => {
  socket.on('connect', () => setIsConnected(true));
  socket.on('disconnect', () => setIsConnected(false));
  return () => {
    socket.off('connect');
    socket.off('disconnect');
  };
}, []);

การส่งแบบไม่รับประกัน

ใช้ socket.volatile.emit() สำหรับข้อความที่ยอมรับได้หากมีแพ็กเก็ตสูญหายเป็นครั้งคราว (เช่น ตำแหน่งเคอร์เซอร์หรือสถานะเกม)

// Position updates — OK to lose some
function onMouseMove(e) {
  socket.volatile.emit('cursor', { x: e.clientX, y: e.clientY });
}

Socket.IO กับ WebSocket โดยตรง

Socket.IO เพิ่มการจัดการห้อง เนมสเปซ การเชื่อมต่อใหม่อัตโนมัติ และการรองรับข้อมูลไบนารีบน WebSocket ให้ใช้ WebSocket โดยตรงหากต้องการค่าใช้จ่ายส่วนเกินให้น้อยที่สุด หรือเซิร์ฟเวอร์ไม่รองรับ Socket.IO

ตรวจสอบอย่างรวดเร็ว

เหตุใดจึงควรลบตัวรับฟังเหตุการณ์ของ Socket.IO ในการล้างข้อมูลของ useEffect

สรุปทบทวน

สร้างอินสแตนซ์ socket แบบซิงเกิลตันด้วย io(url, { autoConnect: false }) เชื่อมต่อและยกเลิกการเชื่อมต่อใน useEffect ลบตัวรับฟังในฟังก์ชันล้างข้อมูลเสมอ และส่งเหตุการณ์ด้วย socket.emit() ห่อหุ้มตรรกะไว้ในฮุกกำหนดเองเพื่อให้นำกลับมาใช้ซ้ำ

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

บทเรียน “การใช้ Socket.IO กับ React” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การใช้ Socket.IO กับ React”

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

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

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

บทเรียน “การใช้ Socket.IO กับ React” ใช้เวลานานแค่ไหน

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

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

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

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

  1. พื้นฐาน WebSocket ในเบราว์เซอร์
  2. การใช้ Socket.IO กับ React
  3. การสร้างคอมโพเนนต์แชตแบบเรียลไทม์
  4. การเชื่อมต่อใหม่ การจัดการข้อผิดพลาด และการล้างข้อมูล
← กลับไปที่ React Academy