You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 10:34:54