使用 ECharts 与 Vue 构建数据可视化组件

news2024/12/27 11:46:40

在前端开发中,数据可视化是非常重要的一部分。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: 用于显示自定义的提示信息,默认为空数组。
  • xNameyName: 分别为 X 轴和 Y 轴的名称。
  • singleSelect: 布尔值,控制图例是否为单选。
  • type: 图表的类型,如线图、柱状图等。
  • RequestParameters: 请求参数,用于一些特定的业务需求,默认为空对象。
3. datamounted 钩子
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 获取 DOM
    if (chartDom) {
      this.chartInstance = echarts.init(chartDom); // 初始化 ECharts 实例
      this.updateChart(); // 更新图表
    } else {
      console.error("图表容器未找到");
    }
  },
  updateChart() {
    let option = {};
    switch (this.type) {
      case 'timeLine':
        option = this.getTimeLineDataTicks();
        break;
      // 省略其他 case
      default:
        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 的配置格式,定义图表的 tooltiplegendxAxisyAxis,最后返回整个图表的配置对象。
  • tooltip: 鼠标悬停时显示的提示框,通过 formatter 方法自定义提示信息。

  • legend: 图例部分,用户可以根据图例显示或隐藏某些系列的数据。

  • xAxisyAxis: 定义 X 轴和 Y 轴的样式与数据。

  • series: 定义图表中的每个系列数据,这里是折线图。

6. 样式部分
<style scoped>
.chart {
  width: 100%;
  height: 400px;
}
</style>
  • 样式部分很简单,我们为 chart 容器设置了宽度和高度。
7. 完整的工作流程
  1. 组件被挂载到 DOM 上后,mounted 钩子被触发,调用 initChart 方法。
  2. initChart 方法中,通过 this.$refs.chart 获取图表的 DOM 容器,并使用 echarts.init 初始化 ECharts 实例。
  3. 根据传入的 type,在 updateChart 方法中调用不同的图表配置生成方法(如 getTimeLineDataTicks)。
  4. 生成的配置通过 chartInstance.setOption 方法应用到图表上,最终完成图表的渲染。
  5. 当窗口大小发生变化时,handleResize 会自动调整图表的尺寸。

总结

通过 Vue 和 ECharts 的结合,我们可以轻松实现一个高度可复用的图表组件。组件化的设计让我们可以将不同类型的图表封装在一起,并且根据传入的 type 动态渲染出不同的图表。无论是折线图、柱状图还是复杂的树状图,都能通过 ECharts 强大的图表配置系统轻松实现。

希望这篇博客能够帮助你更好地理解如何在 Vue 项目中集成 ECharts,并且为你今后的数据可视化项目提供一些思路和参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2266372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量

文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量&#xff0c;你可以使用以下 SQL 查询语句&#xff1a; SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释&#xff1a; …

RocketMQ的集群架构是怎样的?

大家好&#xff0c;我是锋哥。今天分享关于【RocketMQ的集群架构是怎样的?】面试题。希望对大家有帮助&#xff1b; RocketMQ的集群架构是怎样的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RocketMQ 是阿里巴巴开源的分布式消息中间件&#xff0c;广泛用于处…

使用DynadotAPI查看域名清仓中的过期域名列表

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

uni-app 中使用微信小程序第三方 SDK 及资源汇总

&#x1f380;&#x1f380;&#x1f380;uni-app 跨端开发系列 &#x1f380;&#x1f380;&#x1f380; 一、uni-app 组成和跨端原理 二、uni-app 各端差异注意事项 三、uni-app 离线本地存储方案 四、uni-app UI库、框架、组件选型指南 五、uni-app 蓝牙开发 六、uni-app …

探索 Pencils Swap 的叙事:为 DeFi 的再次爆发蓄力

Pencils Protocol 最初是 Scroll 生态上一个综合性的 DeFi 平台&#xff0c;以 Farming、Vaults 以及 Auction 等系列产品板块为基础&#xff0c;其不仅成为了 Scroll 上重要的流动性、收益枢纽&#xff0c;同时也是重要的 LaunchPad 市场以及流量池&#xff0c;为 Scroll 生态…

基于STM32单片机矿井矿工作业安全监测设计

基于STM32单片机矿井矿工作业安全监测设计 目录 项目开发背景设计实现的功能项目硬件模块组成设计思路系统功能总结使用的模块技术详情介绍总结 1. 项目开发背景 随着矿井矿工作业环境的复杂性和危险性逐渐增加&#xff0c;矿井作业安全问题引起了社会各界的广泛关注。传统的…

数学建模与数学建模竞赛

什么是数学建模&#xff1f; 数学建模是通过数学的方法和工具&#xff0c;对现实世界的一个特定对象&#xff0c;依据其内在规律&#xff0c;做出一些必要的简化假设&#xff0c;从而建立一个数学结构的过程。数学建模的历史和数学的起源几乎同步开始&#xff0c;2000多年前&a…

stm32四联七段数码管,LED8*8点阵

一、七段数码管的整体代码和仿真 1&#xff09;代码 seg74.c #include "stm32f10x.h" // Device headervoid seg74_init(void) {GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(…

SpringCloudAlibaba技术栈-Dubbo

1、什么是Dubbo? 简单来说&#xff0c;dubbo就像是个看不见的手&#xff0c;负责专门从注册中心nacos调用注册到nacos上面的服务的&#xff0c;因为在微服务环境下不同的功能模块可能在不同的服务器上。dubbo调用服务就像是在调用本地的服务一样。 分布式调用与高并发处理 Du…

“AI智能安全管理系统:让安全无处不在

嘿&#xff0c;大家好&#xff01;今天咱们来聊聊一个超级酷炫又至关重要的东西——AI智能安全管理系统。想象一下&#xff0c;如果有一个系统可以像私人保镖一样24小时不间断地保护你和你的财产&#xff0c;是不是感觉特别安心&#xff1f;这就是AI智能安全管理系统带给我们的…

【hackmyvm】soul靶机wp

tags: HMVrbash绕过图片隐写PHP配置解析 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集3. 图片解密3.1. 爆破用户名3.2. 绕过rbash3.3. 提权检测 4. 获取webshell4.1. 修改php配置 5. www-data提权gabriel6. gabriel提取到Peter7. Peter提权root 靶机链接 https://ha…

PaddleOCR训练自己的私有数据集(包括标注、制作数据集、训练及应用)

目录 一、制作数据集 1、进入到PaddleOCR-releas-2.7目录 2、首先启用PPOCRLabel&#xff1a;在终端激活环境 3、接着点击左下角的自动标注 4、确认完成后点击左上角 5、新建gen_ocr_train_val_test.py 二、训练文字检测模型 1、模型下载 2.、配置ppocr检测模型文件 …

网络层协议--ip协议

目录 引言 IP协议 协议头格式 16位标识与3位标志与13位片偏移讲解 网段划分(重要) DHCP技术 CIDR技术 特殊的IP地址 广播主机 IP地址的数量限制 私有IP地址和公网IP地址 路由&#xff1a;在复杂的网络结构中, 找出一条通往终点的路线 简单认识路由器 路由表生成算…

区块链期末复习3.2:比特币脚本

目录 一、输入输出脚本的执行 二、简单脚本实例及压栈过程 1.P2PK&#xff08;pay to public key hash&#xff09; 2、P2PH&#xff08;pay to public key hash&#xff09; 3.多重签名 4.比特币脚本的应用&#xff1a; 三、其他常见指令 1.OP_EQUAL与OP&#xff3f;EQ…

【Mac】终端改色-让用户名和主机名有颜色

效果图 配置zsh 1.打开终端&#xff0c;进入.zshrc配置 cd ~ vim .zshrc2.添加如下配置并保存 # 启用命令行颜色显示 export CLICOLOR1 ## 加载颜色支持 autoload -U colors && colors # 配置 zsh 提示符 PROMPT"%{$fg_bold[red]%}%n%{$reset_color%}%{$fg_bol…

CUDA各种内存和使用方法

文章目录 1、全局内存2、局部内存3、共享内存3.1 静态共享内存3.2 动态共享内存 4、纹理内存5、常量内存6、寄存器内存7、用CUDA运行时API函数查询设备CUDA 错误检测 1、全局内存 特点&#xff1a;容量最大&#xff0c;访问延时最大&#xff0c;所有线程都可以访问。 线性内存…

青少年科普教学系统平台的设计与实现springboot

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安…

Vue2:v-for创建echart图表时不能使用动态ref,要使用动态id

项目中需要创建一组图表+表格的组合,一共15组,为了便于维护,希望使用v-for来创建,而不是写出15组<div>,但是动态指定echart的ref时,频繁遭遇init失败,提示“TypeError: this.dom.getContext is not a function”。过程记录如下。 实现效果 要实现的效果如下图,…

Ch9 形态学图像处理

Ch9 形态学图像处理 blog点此处&#xff01;<--------- 四大算子相应性质。 腐蚀、膨胀、开闭之间的含义、关系 文章目录 Ch9 形态学图像处理预备知识(Preliminaries)膨胀和腐蚀(Dilation and Erosion)腐蚀膨胀膨胀与腐蚀的对偶关系 开闭操作(Opening and Closing)开运算闭…

likeAdmin架构部署(踩坑后的部署流程

1、gitee下载 https://gitee.com/likeadmin/likeadmin_java.git 自己克隆 2、项目注意 Maven&#xff1a;>3.8 ❤️.9 (最好不要3.9已经试过失败 node &#xff1a;node14 (不能是18 已经测试过包打不上去使用14的换源即可 JDK&#xff1a;JDK8 node 需要换源 npm c…