基于 Vue 3 封装一个 ECharts 图表组件

在前端开发中,数据可视化是展示数据的重要方式之一。ECharts 是一个强大的开源可视化库,能够帮助我们轻松地创建各种图表。本文将介绍如何在 Vue 3 项目中使用 ECharts 封装一个图表组件。

代码

<template>
  <div ref="chartRef" style="height: 100%; width: 100%"></div>
</template>

<script setup lang="ts">
import * as echarts from "echarts";
import { onMounted, onUnmounted, shallowRef, watch } from "vue";

const props = defineProps(["option"]);

// 使用 shallowRef 来创建一个对 div 元素的引用
const chartRef = shallowRef(null);

let chartInstance: echarts.ECharts | null = null;

// 初始化图表,如果图表容器不可用或图表已初始化,则不执行任何操作。
const initChart = () => {
  if (!chartRef.value) {
    console.error("图表容器不可用。");
    return;
  }
  if (chartInstance) {
    // 防止重复初始化
    return;
  }
  try {
    chartInstance = echarts.init(chartRef.value);
    chartInstance.setOption(props.option);
  } catch (error) {
    console.error("无法加载图表:", error);
  }
};

// 当组件挂载时调用的函数,用于初始化图表并添加窗口大小调整的监听器
onMounted(() => {
  initChart();
  const handleResize = () => {
    if (chartInstance) {
      chartInstance.resize();
    }
  };
  // 监听窗口大小改变,并重新调整图表大小
  window.addEventListener("resize", handleResize);

  // 当组件卸载时调用的函数,用于清理资源
  onUnmounted(() => {
    if (chartInstance) {
      chartInstance.dispose();
      chartInstance = null;
    }
    window.removeEventListener("resize", handleResize);
  });
});

// 监听 props.option 的变化,以更新图表选项
watch(
  () => props.option,
  (newOption: echarts.EChartsOption) => {
    if (chartInstance) {
      chartInstance.setOption(newOption);
      chartInstance.resize();
    }
  }
);
</script>

说明

容器定义

<template>
  <div ref="chartRef" style="height: 100%; width: 100%"></div>
</template>

这段代码用于创建图表容器,并使用 ref 指令获取该元素的引用。相比于使用 id,ref 更加灵活,避免了 id 重复的问题,且更符合 Vue 的响应式编程风格。

引用实例

const chartRef = shallowRef(null);
let chartInstance: echarts.ECharts | null = null;

使用 shallowRef 创建对 div 元素的引用。shallowRef 和 ref 的区别在于,shallowRef 仅对引用对象的第一层做响应式处理,避免了不必要的性能消耗。本文引用的 DOM 元素不需要深层次的响应式处理,所以选择 shallowRef

初始化

const initChart = () => {
  if (!chartRef.value) {
    console.error("图表容器不可用。");
    return;
  }
  if (chartInstance) {
    // 防止重复初始化
    return;
  }
  try {
    chartInstance = echarts.init(chartRef.value);
    chartInstance.setOption(props.option);
  } catch (error) {
    console.error("无法加载图表:", error);
  }
};

通过 echarts.init 初始化图表实例,并设置图表配置。该函数首先检查 chartRef 是否存在,以避免在容器不可用时初始化图表。然后,通过 echarts.init 初始化图表实例,并设置图表配置。

挂载卸载

onMounted(() => {
  initChart();
  const handleResize = () => {
    if (chartInstance) {
      chartInstance.resize();
    }
  };
  // 监听窗口大小改变,并重新调整图表大小
  window.addEventListener("resize", handleResize);

  // 当组件卸载时调用的函数,用于清理资源
  onUnmounted(() => {
    if (chartInstance) {
      chartInstance.dispose();
      chartInstance = null;
    }
    window.removeEventListener("resize", handleResize);
  });
});

挂载不必解释,卸载是为了及时清理,防止可能的内存泄露问题。

及时更新

watch(
  () => props.option,
  (newOption: echarts.EChartsOption) => {
    if (chartInstance) {
      chartInstance.setOption(newOption);
      chartInstance.resize();
    }
  }
);

图表是有可能动态变化的,因此要设置一个监听,这样的话,数据就能得到及时的更新。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea搜索只显示100条、如何修改idea搜索的条数

文章目录 一、老版本的IDEA&#xff08;2021年之前的版本&#xff09;二、新版本的IDEA&#xff08;2021年及之后的版本&#xff09;2.1、方式一2.2、方式二 如下图&#xff1a;idea搜索的时候默认只显示100条 要解决IDEA搜索只显示100条的问题&#xff0c;可以通过修改搜索结…

【推荐】Perl入门教程特点功能文本处理读取文件替换文本写入文件分割字符数据库处理环境准备安装(包含示咧)

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

HashMap详解(含动画演示)

目录 HashMap1、HashMap的继承体系2、HashMap底层数据结构3、HashMap的构造函数①、无参构造②、有参构造1 和 有参构造2 (可以自定义初始容量和负载因子)③、有参构造3(接受一个Map参数)JDK 8之前版本的哈希方法&#xff1a;JDK 8版本的哈希方法 4、拉链法解决哈希冲突什么是拉…

监控室,屏幕显示不支持码流

1号屏&#xff0c;出现不支持码流 如下原因 老是录像机 无法关闭自动添加摄像头功能&#xff0c; 其他杂牌摄像头 会自动还ip 最终导致 ip冲突 更换ip 可以解决

Arnoldi Iteration 思考

文章目录 1. 投影平面2. Arnoldi Iteration3. python 代码 1. 投影平面 假设我们有一个向量q,我们需要关于向量q&#xff0c;构建一个投影平面P&#xff0c;使得给定任何向量v,可以通过公式 p P v pPv pPv&#xff0c;快速得到向量v在投影平面P上的投影向量p. 计算向量内积,…

部署LVS-DR群集...

目录 最后一台主机&#xff08;第四台&#xff09; 本地yum源安装httpd&#xff08;非必做&#xff09; 继续开始从最后一台主机开始&#xff08;第四台&#xff09; 转第二台主机 转第三台主机 回第二台 上传 转第三台主机 上传 回第二台 转第三台 转第一台主机…

Parallelize your massive SHAP computations with MLlib and PySpark

https://medium.com/towards-data-science/parallelize-your-massive-shap-computations-with-mllib-and-pyspark-b00accc8667c (能翻墙直接看原文&#xff09; A stepwise guide for efficiently explaining your models using SHAP. Photo by Pietro Jeng on Unsplash Int…

前端:鼠标点击实现高亮特效

一、实现思路 获取鼠标点击位置 通过鼠标点击位置设置高亮裁剪动画 二、效果展示 三、按钮组件代码 <template><buttonclass"blueBut"click"clickHandler":style"{backgroundColor: clickBut ? rgb(31, 67, 117) : rgb(128, 128, 128),…

docker login 报错: http: server gave HTTP response to HTTPS client

环境&#xff1a; 自建 Harbor、Docker 1. 问题分析 # 命令&#xff0c;这里用的是 IP&#xff0c;可以为域名 docker login -u test 172.16.51.182:31120 # 输入密码 Password:# 报错如下&#xff1a; Error response from daemon: Get "https://172.16.51.182:31120/…

[DDR4] DDR 简史

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR4》 存和硬盘&#xff0c;这对电脑的左膀右臂&#xff0c;共同扛起了存储的重任。内存以其超凡的存取速度闻名&#xff0c;但一旦断电&#xff0c;内存中的数据也会消失。它就像我们的工作桌面&…

基于WPF技术的换热站智能监控系统14--搭建西门子PLC通信环境

1、安装博途软件V15 本项目需要用到西门子PLC&#xff0c;系统所需的数据来自现场PLC实时采集的数据&#xff0c;所以需要配置PLC的通信环境&#xff0c;具体请看以下博客文章。 windows10企业版安装西门子博途V15---01准备环境_博途v15.1安装需求-CSDN博客 windows10企业…

5.Sentinel入门与使用

5.Sentinel入门与使用 1.什么是 Sentinel?Sentinel 主要有以下几个功能: 2.为什么需要 Sentinel?3.Sentinel 基本概念3.1 什么是流量控制?3.1.1 常见流量控制算法3.1.2 Sentinel 流量控制流控效果介绍如下: 3.2 什么是熔断?熔断策略 3.3 Sentinel 组成&#xff08;资源和规…

[vue3]组件通信

自定义属性 父组件中给子组件绑定属性, 传递数据给子组件, 子组件通过props选项接收数据 props传递的数据, 在模版中可以直接使用{{ message }}, 在逻辑中使用props.message defineProps defineProps是编译器宏函数, 就是一个编译阶段的标识, 实际编译器解析时, 遇到后会进行…

【Oracle APEX开发小技巧1】转换类型实现显示小数点前的 0 以 及常见类型转换

在 apex 交互式式网格中&#xff0c;有一数值类型为 NUMBER&#xff0c;保留小数点后两位的项&#xff0c;在 展示时小数点前的 0 不显示。 效果如下&#xff1a; 转换前&#xff1a; m.WEIGHT_COEFFICIENT 解决方案&#xff1a; 将 NUMBER&#xff08;20&#xff0c;2&#xf…

模拟电子技术基础(一)--本证半导体与杂质半导体

半导体分为两大类&#xff1a;本征半导体和杂质半导体。这两种类型的半导体在电子结构和电导特性上有显著的区别。 本征半导体&#xff08;Intrinsic Semiconductor&#xff09; 定义和组成&#xff1a;本征半导体是纯净的半导体&#xff0c;没有任何杂质原子。最常见的本征半…

2023年13个最适合销售电子书的WordPress主题

欢迎来到我们用于销售电子书和其他数字/可下载产品&#xff08;软件、应用程序、图标集、主题等&#xff09;的最佳WordPress主题的完整集合。 这些主题有内置的支付网关&#xff0c;可以通过 PayPal、信用卡等处理安全支付。&#xff08;易于配置&#xff01;&#xff09; 最…

Python轮子:Excel读写利器——openpyxl

原文链接&#xff1a;http://www.juzicode.com/python-module-openpyxl 在之前的xlwt和xlrd的文章中我们介绍了Excel访问的2个工具&#xff0c;它们分别只能对Excel文件进行写或者读&#xff0c;今天再介绍一个可以对Excel进行读和写的工具——openpyxl。需要注意的是openpyxl…

MFC工控项目实例之三theApp变量传递对话框参数

承接专栏《MFC工控项目实例之二主菜单制作》 用theApp变量传递对话框参数实时改变iPlotX坐标轴最小值、最大值。 1、新建IDD_SYS_DATA对话框&#xff0c;类名SYS_DATA。 三个编辑框IDC_EDIT1、IDC_EDIT2、IDC_EDIT3变量如图 2、SEAL_PRESSURE.h中添加代码 #include "re…

CleanMyMac X软件下载附加详细安装教程

​首先要介绍的是CleanMyMac X&#xff0c;这是一款极受欢迎的苹果电脑清理软件&#xff0c;它能够全面扫描你的电脑系统&#xff0c;清理无用的文件和垃圾&#xff0c;以释放硬盘空间&#xff0c;除了清理功能之外&#xff0c;CleanMyMac X 还可协助管理应用程序、优化性能、修…

python基础 002 - 2 常用数据类型

python的常用数据类型 int , 整型 1,2,3float ,小数&#xff0c;浮点类型1.2bool , boolean 布尔&#xff0c;真假。判断命题。True Flasestr &#xff0c;字符串 list , 列表 a []tuple, 元组 a ()dict , dictionary, 字典 a {}set , 集合 a {} 1 查看数据类型 typ…