当前位置: 首页 > news >正文

ECharts 实时数据平滑更新实践(含 WebSocket 模拟)

在可视化项目中,常常需要实时展示动态数据,比如流量监控、设备状态、传感器数据等。
很多同学直接使用 setOption 全量更新数据,会导致 图表闪烁、重绘、动画不连贯

本文介绍一种更平滑的更新方案:通过监听数据流变化,实现折线图平移更新
示例中我们使用 模拟 WebSocket 推送 的方式,每秒更新一次数据,图表平滑移动。


🎬 实现效果

折线图每秒新增一个点,曲线平滑向左移动,旧数据自动移除。

<template><div class="chart-container"><div ref="chartRef" class="chart"></div></div>
</template><script setup>
import * as echarts from "echarts";
import { ref, onMounted, onBeforeUnmount, watch } from "vue";const chartRef = ref(null);
let chartInstance = null;// 模拟 WebSocket 推送的数据数组
const chartData = ref([]);
const maxPoints = 30; // 显示的点数上限
let timer = null;// ===================== 初始化 ECharts =====================
const initChart = () => {chartInstance = echarts.init(chartRef.value);const option = {title: {text: "实时数据曲线(平滑移动)",left: "center",textStyle: { fontSize: 14 },},tooltip: { trigger: "axis" },grid: { top: 40, left: 40, right: 20, bottom: 40 },xAxis: {type: "category",boundaryGap: false,data: [],},yAxis: {type: "value",min: 0,max: 100,splitLine: { lineStyle: { color: "#eee" } },},series: [{name: "数据流",type: "line",smooth: true,showSymbol: false,data: [],lineStyle: { color: "#4fc3f7" },areaStyle: { color: "rgba(79,195,247,0.2)" },},],animationDurationUpdate: 300,};chartInstance.setOption(option);
};// ===================== 模拟 WebSocket 推送 =====================
const startMockWS = () => {timer = setInterval(() => {const now = new Date().toLocaleTimeString().split(" ")[0];const value = +(Math.random() * 100).toFixed(2);chartData.value.push({ time: now, value });if (chartData.value.length > maxPoints) chartData.value.shift();}, 1000);
};// ===================== 数据监听(核心逻辑) =====================
watch(chartData,(val) => {if (!chartInstance) return;const xData = val.map((item) => item.time);const yData = val.map((item) => item.value);// ✅ 平滑更新:不重绘,只更新数据chartInstance.setOption({xAxis: { data: xData },series: [{ data: yData }],});},{ deep: true }
);// ===================== 生命周期 =====================
onMounted(() => {initChart();startMockWS();
});onBeforeUnmount(() => {clearInterval(timer);chartInstance?.dispose();
});
</script><style scoped>
.chart-container {width: 100%;height: 400px;
}
.chart {width: 100%;height: 100%;
}
</style>

🔍 技术要点总结

技术点说明
watch(chartData)深度监听数据变化,即使数值没变也触发更新
setOption仅更新 xAxisseries 数据,不重建图表实例
smooth: true平滑曲线过渡
showSymbol: false去掉节点圆点,避免闪烁
animationDurationUpdate更新动画时长,控制平滑效果
shift()限制点数上限,模拟数据流滚动

🧠 延伸思路

  • 如果使用真实 WebSocket,可在 onmessage 中替换 startMockWS 部分;

  • 也可以使用 appendData 提升大数据性能;

  • 若需要断线重连,可封装成 useRealtimeChart composable 逻辑复用。


✅ 最终效果

每秒新增一个点,曲线持续向左平滑移动,无闪烁、不卡顿、无全量重绘。
这种方式非常适合用于 实时监控类大屏、IoT、交通流量、传感器数据流等场景


如果这篇文章对你有帮助,
欢迎点赞 + 收藏 + 关注我 ❤️
后续我会继续更新更多前端实时可视化相关实践。

http://www.dtcms.com/a/507125.html

相关文章:

  • ImmutableList.of() 是 Google Guava 库 提供的一个静态工厂方法,用于创建一个不可变的(immutable)列表。
  • 【计算机网络】408考研计算机网络精讲:物理层核心——信道的极限容量(奈氏准则与香农定理)​​
  • 嵌入式模组拨号获取IP地址时,设置的ippass是什么原理,起到什么作用?
  • 网站开发 实训 报告郑州高端建站公司
  • 2025年--Lc203- 1218. 最长定差子序列(动态规划)--Java版
  • TDengine
  • 【MicroPython编程-ESP32篇】-L298N控制直流电机
  • C# 设计模式——单例模式
  • 单例模式与线程池的实际应用
  • Ubuntu24 逻辑卷磁盘扩容全流程
  • 网站加载速度慢的原因佛山网站建设公司价格
  • 容器化与调度:使用 Docker 与 K8s 管理分布式淘宝商品数据采集任务
  • 微服务熔断降级方案对比:Hystrix、Resilience4j与Sentinel实践
  • 解决在windows中基于Spring AI 集成文件管理MCP服务遇到的问题
  • 【研究生随笔】PyTorch中的概率论
  • 青少年活动中心网站建设依据青岛标志设计公司
  • 网站三要素关键词 描述怎么做网站建设报价单 excel
  • Kubernetes Pod 管理全攻略:从基础操作到进阶优化
  • 基于 OpenHarmony 6.0 的智能充电桩技术方案与实现
  • 三步破局:一致性轨迹强化学习开启扩散语言模型“又快又好”推理新时代
  • Node.js | pnpm下载安装与环境配置
  • 递归-二叉树中的深搜-2331.计算布尔二叉树的值-力扣(LeetCode)
  • 下部刚刚是上部
  • 自动化产线效率低,主要看这四个环节
  • 如何查询网站开发语言杭州企业网站制作
  • sql server网站建设电子商务网络营销的概念
  • 网页制作基础教程代码网站seo软件
  • kafka中server.properties中的关键配置
  • 帧率、分辨率、码率
  • Linux补充01:HTTPS协议原理