使用 ECharts 与 Vue 构建数据可视化组件
在前端开发中,数据可视化是非常重要的一部分。ECharts 作为一个功能强大且易于使用的开源数据可视化库,被广泛应用于各种图表展示需求中。而 Vue.js 是当下流行的前端框架之一,它的数据驱动和组件化开发模式让我们能轻松地将 ECharts 集成到 Vue 组件中。本篇博客将通过一个实际的代码示例,逐步解析如何将 ECharts 与 Vue 结合使用,构建可复用的数据可视化组件。
1. Vue 模板部分
<template><div ref="chart" id="chart-container" style="width: 100%; height: 400px;"></div>
</template>
在 Vue 组件的模板部分,我们定义了一个 div
,它将作为 ECharts 的容器。ref="chart"
是 Vue 中的一个引用,用于在 JavaScript 中获取这个 DOM 元素,style
用于设置图表的宽高。
2. 脚本部分 - Props 定义
props: {source: {type: [Array, Object],required: true},tooltip: {type: Array,default: () => []},xName: {type: String,default: ''},yName: {type: String,default: ''},singleSelect: {type: Boolean,default: false},type: {type: String,required: true},RequestParameters: {type: Object,default: () => ({})}
},
props
是 Vue 组件用于接收父组件传递数据的属性。在这里我们定义了多个属性:
source
: 必填,表示图表的数据源,可以是数组或对象。tooltip
: 用于显示自定义的提示信息,默认为空数组。xName
和yName
: 分别为 X 轴和 Y 轴的名称。singleSelect
: 布尔值,控制图例是否为单选。type
: 图表的类型,如线图、柱状图等。RequestParameters
: 请求参数,用于一些特定的业务需求,默认为空对象。
3. data
和 mounted
钩子
data() {return {chartInstance: null,};
},
mounted() {this.initChart(); // 初始化图表window.addEventListener('resize', this.handleResize); // 监听窗口大小变化
},
beforeDestroy() {window.removeEventListener('resize', this.handleResize);if (this.chartInstance) {this.chartInstance.dispose(); // 销毁图表实例}
}
data
: Vue 组件的局部数据。在这里,我们定义了chartInstance
,用于存储 ECharts 实例。mounted
: Vue 的生命周期钩子函数,当组件挂载到 DOM 后会触发。我们在这里初始化图表并监听窗口大小变化,以便图表在窗口尺寸变化时能够自适应。beforeDestroy
: 在组件销毁前,我们移除窗口的 resize 事件监听器,并销毁 ECharts 实例,避免内存泄漏。
4. 图表的初始化和更新
methods: {handleResize() {if (this.chartInstance) {this.chartInstance.resize(); // 调用图表实例的 resize 方法}},initChart() {const chartDom = this.$refs.chart; // 通过 ref 获取 DOMif (chartDom) {this.chartInstance = echarts.init(chartDom); // 初始化 ECharts 实例this.updateChart(); // 更新图表} else {console.error("图表容器未找到");}},updateChart() {let option = {};switch (this.type) {case 'timeLine':option = this.getTimeLineDataTicks();break;// 省略其他 casedefault:console.warn(`不支持的图表类型: ${this.type}`);}if (option && this.chartInstance) {this.chartInstance.setOption(option); // 设置图表配置项}},
}
handleResize
: 当窗口大小变化时,调用图表实例的resize
方法让图表自适应。initChart
: 使用this.$refs.chart
获取 DOM 元素,调用echarts.init
方法来初始化 ECharts 实例。updateChart
: 根据type
判断要渲染的图表类型,并调用对应的生成图表配置的方法,如getTimeLineDataTicks
。然后将生成的配置传入chartInstance.setOption
方法,完成图表的渲染。
5. 图表配置的生成
接下来,我们来看一个具体的图表配置生成函数:
getTimeLineDataTicks() {const { source, xName, yName, singleSelect } = this;const xAxis = [];const legend = [];const series = [];this.source.forEach(item => {const date = new Date(item.name);item.name = date.toLocaleString(); if (!xAxis.includes(item.name)) xAxis.push(item.name);if (!legend.includes(item.group)) legend.push(item.group);});legend.forEach(group => {const seriesData = source.filter(item => item.group === group).map(item => item.value);series.push({name: group,type: 'line',data: seriesData,connectNulls: true,showSymbol: true,label: {show: true,position: 'top',formatter: '{c}',},});});return {tooltip: {trigger: 'axis',formatter(params) {let tooltip = `${xName} : ${params[0].name}<br/>`;params.forEach(param => {tooltip += `<span style="background-color:${param.color};"></span>`;tooltip += `${param.seriesName} : ${param.value}<br/>`;});return tooltip;}},legend: {data: legend,selectedMode: singleSelect ? 'single' : 'multiple',},xAxis: {type: 'category',name: xName,data: xAxis,boundaryGap: false,},yAxis: {type: 'value',name: yName,},series: series,};
}
-
getTimeLineDataTicks
: 这个方法生成时间轴折线图的配置项。- 首先从
source
中提取 X 轴数据(xAxis
)、图例数据(legend
)和每个系列(series
)的数据点。 - 使用 ECharts 的配置格式,定义图表的
tooltip
、legend
、xAxis
和yAxis
,最后返回整个图表的配置对象。
- 首先从
-
tooltip
: 鼠标悬停时显示的提示框,通过formatter
方法自定义提示信息。 -
legend
: 图例部分,用户可以根据图例显示或隐藏某些系列的数据。 -
xAxis
和yAxis
: 定义 X 轴和 Y 轴的样式与数据。 -
series
: 定义图表中的每个系列数据,这里是折线图。
6. 样式部分
<style scoped>
.chart {width: 100%;height: 400px;
}
</style>
- 样式部分很简单,我们为
chart
容器设置了宽度和高度。
7. 完整的工作流程
- 组件被挂载到 DOM 上后,
mounted
钩子被触发,调用initChart
方法。 - 在
initChart
方法中,通过this.$refs.chart
获取图表的 DOM 容器,并使用echarts.init
初始化 ECharts 实例。 - 根据传入的
type
,在updateChart
方法中调用不同的图表配置生成方法(如getTimeLineDataTicks
)。 - 生成的配置通过
chartInstance.setOption
方法应用到图表上,最终完成图表的渲染。 - 当窗口大小发生变化时,
handleResize
会自动调整图表的尺寸。
总结
通过 Vue 和 ECharts 的结合,我们可以轻松实现一个高度可复用的图表组件。组件化的设计让我们可以将不同类型的图表封装在一起,并且根据传入的 type
动态渲染出不同的图表。无论是折线图、柱状图还是复杂的树状图,都能通过 ECharts 强大的图表配置系统轻松实现。
希望这篇博客能够帮助你更好地理解如何在 Vue 项目中集成 ECharts,并且为你今后的数据可视化项目提供一些思路和参考。
相关文章:
使用 ECharts 与 Vue 构建数据可视化组件
在前端开发中,数据可视化是非常重要的一部分。ECharts 作为一个功能强大且易于使用的开源数据可视化库,被广泛应用于各种图表展示需求中。而 Vue.js 是当下流行的前端框架之一,它的数据驱动和组件化开发模式让我们能轻松地将 ECharts 集成到 …...

Yocto 项目 - 共享状态缓存 (Shared State Cache) 机制
引言 在嵌入式开发中,构建效率直接影响项目的开发进度和质量。Yocto 项目通过其核心工具 BitBake 提供了灵活而强大的构建能力。然而,OpenEmbedded 构建系统的传统设计是从头开始构建所有内容(Build from Scratch),这…...

Unity3D仿星露谷物语开发9之创建农场Scene
1、目标 绘制农场的场景。通过不同Sorting Layer控制物体的显示优先级,绘制Tilemap地图,添加Tilemap Collider碰撞器,同时添加Composite Collider碰撞器优化性能。 ps:绘制Tilemap的技巧:通过"Shift [" 可…...

STM32-笔记20-测量按键按下时间
1、按键按下的时间-思路 我们先检测下降沿信号,检测到以后,在回调函数里切换成检测上升沿信号,当两个信号都检测到的时候,这段时间就是按键按下的时间,如图所示:>N*(ARR1)CCRx的值 N是在这段时间内&…...

2024年12月30日Github流行趋势
项目名称:free-programming-books 项目地址url:https://github.com/EbookFoundation/free-programming-books项目语言:HTML历史star数:343,398今日star数:246项目维护者:vhf, eshellman, davorpa, MHM5000,…...

SAP PP bom历史导出 ALV 及XLSX 带ECN号
bom总数 104W PS超过XLSX上限 ,那就分文件 *&---------------------------------------------------------------------* *& Report ZRPT_PP_BOM_HIS_ECN *&---------------------------------------------------------------------* *& tcode:zpp0…...
使用WebRTC进行视频通信
一、WebRTC技术简介 什么是WebRTC? 是一种支持浏览器之间实时音频、视频和数据传输的开放源代码项目。它允许开发者在不需要任何第三方插件或软件的情况下实现点对点的实时通信。WebRTC已经成为现代Web应用中的关键技术,为开发者提供了强大的工具和API…...

npm ERR! ECONNRESET 解决方法
问题:npm 命令遇到的错误是 ECONNRESET,这通常与网络连接问题相关。设置代理解决问题。 一、查看当前代理设置 npm config get proxy npm config get https-proxy二、设置代理 npm config set proxy http://your-proxy-address:port npm config set h…...

【连续学习之SS-IL算法】2021年CPVR会议论文Ss-il:Separated softmax for incremental learning
1 介绍 年份:2021 期刊: 2021CPVR Ahn H, Kwak J, Lim S, et al. Ss-il: Separated softmax for incremental learning[C]//Proceedings of the IEEE/CVF International conference on computer vision. 2021: 844-853. 本文提出的SS-IL(…...

Go+chromedp实现Web UI自动化测试
1.为什么使用go进行UI自动化测试? 速度:Go速度很快,这在运行包含数百个UI测试的测试套件时是一个巨大的优势 并发性:可以利用Go的内置并发性(goroutines)来并行化测试执行 简单:Go的简约语法允许您编写可读且可维护…...
【MySQL 高级特性与性能优化】
MySQL 高级特性与性能优化 一、MySQL 存储引擎 (一)InnoDB 存储引擎 1. 特点 支持事务:InnoDB 是 MySQL 中提供完整 ACID 事务支持的存储引擎,这意味着它能够保证数据库操作在复杂的并发环境下的一致性、隔离性、原子性和持久…...

Spring Boot教程之三十九: 使用 Maven 将 Spring Boot 应用程序 Docker 化
如何使用 Maven 将 Spring Boot 应用程序 Docker 化? Docker是一个开源容器化工具,用于在隔离环境中构建、运行和管理应用程序。它方便开发人员捆绑其软件、库和配置文件。Docker 有助于将一个容器与另一个容器隔离。在本文中,为了将Spring B…...
微信小程序开发示例
微信小程序开发涉及多个方面,包括页面布局、交互逻辑、数据处理等。以下是一个简单的微信小程序开发示例,包括页面布局、样式定义、交互逻辑等方面的内容。 一、页面布局(WXML) <!-- index.wxml --> <view class"…...
【机器学习】概述
文章目录 1. 机器学习三步骤2. 机器学习图谱2.1 任务类型 (Task)2.2 模型选择 (Methods)2.3 学习场景 (Scenario) 1. 机器学习三步骤 定义一个模型 (Define a set of function) 选择一组合适的函数来表示模型。 评估模型好坏 (Goodness of function) 找到一个损失函数…...

音视频采集推流时间戳记录方案
音视频同步更多文章 深入理解音视频pts,dts,time_base以及时间数学公式_视频pts计算-CSDN博客 ffplay音视频同步分析_ffplay 音视频同步-CSDN博客 音视频采集打时间戳设计 实时音视频数据的采集和处理场景。具体来说: 采集阶段: 在音视频数据采集过…...

【Linux】:线程安全 + 死锁问题
📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 1. 线程安全和重入问题&…...

【深度学习】时间序列表示方法
自然界除了2D的图片数据之外,还有语音、文字,这些数据都有时间的先后顺序的。对于2D的图像的数据,可以用RGB值来表示像素的色彩度。语音可以用信号幅度值来表示,而Pytorch没有自带String支持,在表示文字之前需要进行Em…...

1.微服务灰度发布落地实践(方案设计)
文章目录 前言灰度发布的优点设计概要系统架构图流量控制客户端服务端 路由路径应用客户端实现核心组件分析1.网关2. spring-cloud3. dubbo4. nocas5. thread6. message queue 前言 微服务架构中的灰度发布(也称为金丝雀发布或渐进式发布)是一种在不影响…...

【UE5 C++课程系列笔记】15——Assert的基本使用
目录 概念 一、Check 二、Verify 三、Ensure 对比 基本使用 一、check的基本使用 二、ensure的基本使用 三、verify的基本使用 概念 assert 可在开发期间帮助检测和诊断不正常或无效的运行时条件。这些条件通常检查是否指针为非空、除数为非零、函数并非递归运行&…...

kubernetes Gateway API-1-部署和基础配置
文章目录 1 部署2 最简单的 Gateway3 基于主机名和请求头4 重定向 Redirects4.1 HTTP-to-HTTPS 重定向4.2 路径重定向4.2.1 ReplaceFullPath 替换完整路径4.2.2 ReplacePrefixMatch 替换路径前缀5 重写 Rewrites5.1 重写 主机名5.2 重写 路径5.2.1 重新完整路径5.2.1 重新部分路…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...