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

Socket.IO配合React实现广播时调用socket.on报null属性读取错误

错误根因

App组件中socket的初始状态为null,子组件Dashboard首次渲染时接收到的socket参数还未完成初始化,此时useEffect直接执行socket.on()就会触发空指针报错。你之前调用emit方法未报错是因为该方法仅在点击按钮时触发,此时socket已经完成初始化赋值。

修复方案

方案1:子组件内增加非空判断,同时补充事件解绑逻辑避免内存泄漏

修改dashboard.js中的useEffect部分:

useEffect(() => {
    // 新增非空判断,仅当socket实例存在时才绑定事件
    if (!socket) return;
    const handleToggle = (type) => {
        console.log(type);
    };
    socket.on('toggle button', handleToggle);
    // 组件卸载时解绑事件,避免重复绑定和内存泄漏
    return () => {
        socket.off('toggle button', handleToggle);
    };
}, [socket]);

同时建议给toggleLight方法也增加非空判断,避免socket未初始化时点击按钮触发报错:

function toggleLight(type) {
    if(type && socket) {
        socket.emit("toggle light", type);
        console.log(type);
    }
}

方案2:父组件等待socket初始化完成后再渲染子组件

修改App.js的渲染逻辑,仅当socket实例存在时才渲染Dashboard:

return (
    <Router>
        <div className="app">
            <div className="app__view">
                <Switch>
                    <Route exact path="/">
                        {/* 新增判断,socket初始化完成后再传递给子组件 */}
                        {socket && <Dashboard socket={socket} />}
                    </Route>
                </Switch>
            </div>
        </div>
    </Router>
);

内容的提问来源于stack exchange,提问作者Jonas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:06:03