การใช้ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน WebSocket ในเบราว์เซอร์
- การใช้ Socket.IO กับ React
- การสร้างคอมโพเนนต์แชตแบบเรียลไทม์
- การเชื่อมต่อใหม่ การจัดการข้อผิดพลาด และการล้างข้อมูล