为何useEffect中首行代码被忽略?Socket.io场景问题
问题分析与解决
首先,你的代码存在语法错误:socket.on的回调函数后缺少闭合括号,修复后的代码如下:
import { socket } from "../socket.js" useEffect(()=>{ console.log('effect ran') socket.on('turn',(data)=>{ console.log('the data', data) }) // 补上缺失的闭合括号 },[socket])
即便修复语法,你遇到的console.log('effect ran')未执行的问题,核心是useEffect触发逻辑与socket事件触发逻辑混淆:
- useEffect仅在依赖项
socket发生变化时执行,并非客户端发送信号时触发。客户端发信号只会触发socket.on('turn')的回调,和useEffect的执行无关。 - 若想每次客户端发送信号时都打印
effect ran,需将该语句移入socket.on回调内:
import { socket } from "../socket.js" useEffect(()=>{ const handleTurn = (data) => { console.log('effect ran') console.log('the data', data) } socket.on('turn', handleTurn) // 清理监听避免内存泄漏 return () => socket.off('turn', handleTurn) },[socket])
- 若你确实需要在useEffect执行时打印日志,那只有当
socket依赖项变化时才会触发。可检查socket是否为单例实例(单例下引用不变,useEffect仅执行一次)。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

