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

React中如何将WebSocket数据追加至State而非覆盖原有数据

解决WebSocket数据覆盖React State的问题

首先,把chartData的初始状态从null改成空数组,因为我们要存储一系列时序数据:

const [chartData, setChartData] = React.useState([]);

然后,更新状态时不能直接传入新值,得用函数式更新基于旧状态追加新数据——这样能保证每次拿到最新的历史数据,不会覆盖:

// 父组件中传给Socket的dataFunction
const handleNewData = (decodedData) => {
  setChartData(prevData => [...prevData, decodedData]);
};

另外,你的Socket组件存在重复连接的问题:每次组件渲染都会创建新的WebSocket实例,会导致冗余连接和内存泄漏。需要把WebSocket初始化放到useEffect里,并在组件卸载时关闭连接:

const Socket = ({ url, protocol, dataFunction }) => {
  React.useEffect(() => {
    const ws = new WebSocket(url); // 注意拼写是WebSocket,不是Websocket
    
    ws.onmessage = function onMessage(msg) {
      if (protocol === 'JSON') { // 这里要判断字符串'JSON',而非全局JSON对象
        const decoded = JSON.parse(msg.data);
        dataFunction(decoded);
      }
    };

    // 组件卸载时关闭连接,避免内存泄漏
    return () => {
      ws.close();
    };
  }, [url, protocol, dataFunction]); // 依赖项变化时重新创建连接

  return null; // Socket组件无需渲染DOM内容
};

如果后续时序数据量过大,建议做数据裁剪(比如只保留最近100条),避免状态体积过大影响性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:22:08