Vue3实战笔记(43)—Vue3组合式API下封装可复用ECharts图表组件

文章目录

  • 前言
  • 一、封装echart图标钩子
  • 二、使用步骤
  • 总结


前言

接上文,已经安装好了ECharts,开始封装组件方便使用。


一、封装echart图标钩子

首先应用我们之前学习的钩子方式,在hooks目录下创建一个名为 useECharts.js 的文件,用于封装 ECharts 的逻辑:


import { ref, onMounted, onUnmounted } from 'vue';
import * as echarts from 'echarts';export default function useECharts(chartContainer, options) {const chartInstance = ref(null);onMounted(() => {// 初始化 ECharts 实例chartInstance.value = echarts.init(chartContainer.value);// 设置 ECharts 配置项chartInstance.value.setOption(options.value);// 监听窗口大小变化,自动调整图表大小window.addEventListener('resize', () => chartInstance.value.resize());});onUnmounted(() => {// 销毁 ECharts 实例chartInstance.value.dispose();// 移除窗口大小变化监听器window.removeEventListener('resize', () => chartInstance.value.resize());});// 返回 ECharts 实例,以便在外部进行操作return chartInstance;
}

二、使用步骤

其实这样就做到了简单的封装,可以直接使用了:

  <div ref="chartContainer" style="width: 100%; height: 400px"></div>
</template><script>
import useECharts from './useECharts';export default {setup() {const chartContainer = ref(null);const options = ref({// ECharts 配置项title: {text: 'ECharts 示例',},tooltip: {},xAxis: {data: ['类目1', '类目2', '类目3', '类目4', '类目5', '类目6'],},yAxis: {},series: [{name: '数值',type: 'bar',data: [5, 20, 36, 10, 10, 20],},],});const chartInstance = useECharts(chartContainer, options);// 你可以在这里根据需要操作 ECharts 实例,例如更新数据// chartInstance.value.setOption({...})return {chartContainer,};},
};
</script>

为了更方便使用,我们可以进一步封装一些常用的组件,例如:
在components中创建组件EChartsGaugeClock.vue

代码如下(示例):


<template><div ref="chartContainer" style="width: 100%; height: 100%"></div>
</template><script setup lang="ts" name="">
import { ref } from 'vue';
import useECharts from '@/hooks/useECharts';const chartContainer = ref(null);const options = ref({series: [{name: 'hour',type: 'gauge',startAngle: 90,endAngle: -270,min: 0,max: 12,splitNumber: 12,clockwise: true,axisLine: {lineStyle: {width: 15,color: [[1, 'rgba(0,0,0,0.7)']],shadowColor: 'rgba(0, 0, 0, 0.5)',shadowBlur: 15}},splitLine: {lineStyle: {shadowColor: 'rgba(0, 0, 0, 0.3)',shadowBlur: 3,shadowOffsetX: 1,shadowOffsetY: 2}},axisLabel: {fontSize: 50,distance: 25,formatter: function (value) {if (value === 0) {return '';}return value + '';}},anchor: {show: true,icon: 'path://M532.8,70.8C532.8,70.8,532.8,70.8,532.8,70.8L532.8,70.8C532.7,70.8,532.8,70.8,532.8,70.8z M456.1,49.6c-2.2-6.2-8.1-10.6-15-10.6h-37.5v10.6h37.5l0,0c2.9,0,5.3,2.4,5.3,5.3c0,2.9-2.4,5.3-5.3,5.3v0h-22.5c-1.5,0.1-3,0.4-4.3,0.9c-4.5,1.6-8.1,5.2-9.7,9.8c-0.6,1.7-0.9,3.4-0.9,5.3v16h10.6v-16l0,0l0,0c0-2.7,2.1-5,4.7-5.3h10.3l10.4,21.2h11.8l-10.4-21.2h0c6.9,0,12.8-4.4,15-10.6c0.6-1.7,0.9-3.5,0.9-5.3C457,53,456.7,51.2,456.1,49.6z M388.9,92.1h11.3L381,39h-3.6h-11.3L346.8,92v0h11.3l3.9-10.7h7.3h7.7l3.9-10.6h-7.7h-7.3l7.7-21.2v0L388.9,92.1z M301,38.9h-10.6v53.1H301V70.8h28.4l3.7-10.6H301V38.9zM333.2,38.9v10.6v10.7v31.9h10.6V38.9H333.2z M249.5,81.4L249.5,81.4L249.5,81.4c-2.9,0-5.3-2.4-5.3-5.3h0V54.9h0l0,0c0-2.9,2.4-5.3,5.3-5.3l0,0l0,0h33.6l3.9-10.6h-37.5c-1.9,0-3.6,0.3-5.3,0.9c-4.5,1.6-8.1,5.2-9.7,9.7c-0.6,1.7-0.9,3.5-0.9,5.3l0,0v21.3c0,1.9,0.3,3.6,0.9,5.3c1.6,4.5,5.2,8.1,9.7,9.7c1.7,0.6,3.5,0.9,5.3,0.9h33.6l3.9-10.6H249.5z M176.8,38.9v10.6h49.6l3.9-10.6H176.8z M192.7,81.4L192.7,81.4L192.7,81.4c-2.9,0-5.3-2.4-5.3-5.3l0,0v-5.3h38.9l3.9-10.6h-53.4v10.6v5.3l0,0c0,1.9,0.3,3.6,0.9,5.3c1.6,4.5,5.2,8.1,9.7,9.7c1.7,0.6,3.4,0.9,5.3,0.9h23.4h10.2l3.9-10.6l0,0H192.7z M460.1,38.9v10.6h21.4v42.5h10.6V49.6h17.5l3.8-10.6H460.1z M541.6,68.2c-0.2,0.1-0.4,0.3-0.7,0.4C541.1,68.4,541.4,68.3,541.6,68.2L541.6,68.2z M554.3,60.2h-21.6v0l0,0c-2.9,0-5.3-2.4-5.3-5.3c0-2.9,2.4-5.3,5.3-5.3l0,0l0,0h33.6l3.8-10.6h-37.5l0,0c-6.9,0-12.8,4.4-15,10.6c-0.6,1.7-0.9,3.5-0.9,5.3c0,1.9,0.3,3.7,0.9,5.3c2.2,6.2,8.1,10.6,15,10.6h21.6l0,0c2.9,0,5.3,2.4,5.3,5.3c0,2.9-2.4,5.3-5.3,5.3l0,0h-37.5v10.6h37.5c6.9,0,12.8-4.4,15-10.6c0.6-1.7,0.9-3.5,0.9-5.3c0-1.9-0.3-3.7-0.9-5.3C567.2,64.6,561.3,60.2,554.3,60.2z',showAbove: false,offsetCenter: [0, '-35%'],size: 120,keepAspect: true,itemStyle: {color: '#707177'}},pointer: {icon: 'path://M2.9,0.7L2.9,0.7c1.4,0,2.6,1.2,2.6,2.6v115c0,1.4-1.2,2.6-2.6,2.6l0,0c-1.4,0-2.6-1.2-2.6-2.6V3.3C0.3,1.9,1.4,0.7,2.9,0.7z',width: 12,length: '55%',offsetCenter: [0, '8%'],itemStyle: {color: '#C0911F',shadowColor: 'rgba(0, 0, 0, 0.3)',shadowBlur: 8,shadowOffsetX: 2,shadowOffsetY: 4}},detail: {show: false},title: {offsetCenter: [0, '30%']},data: [{value: 0}]},{name: 'minute',type: 'gauge',startAngle: 90,endAngle: -270,min: 0,max: 60,clockwise: true,axisLine: {show: false},splitLine: {show: false},axisTick: {show: false},axisLabel: {show: false},pointer: {icon: 'path://M2.9,0.7L2.9,0.7c1.4,0,2.6,1.2,2.6,2.6v115c0,1.4-1.2,2.6-2.6,2.6l0,0c-1.4,0-2.6-1.2-2.6-2.6V3.3C0.3,1.9,1.4,0.7,2.9,0.7z',width: 8,length: '70%',offsetCenter: [0, '8%'],itemStyle: {color: '#C0911F',shadowColor: 'rgba(0, 0, 0, 0.3)',shadowBlur: 8,shadowOffsetX: 2,shadowOffsetY: 4}},anchor: {show: true,size: 20,showAbove: false,itemStyle: {borderWidth: 15,borderColor: '#C0911F',shadowColor: 'rgba(0, 0, 0, 0.3)',shadowBlur: 8,shadowOffsetX: 2,shadowOffsetY: 4}},detail: {show: false},title: {offsetCenter: ['0%', '-40%']},data: [{value: 0}]},{name: 'second',type: 'gauge',startAngle: 90,endAngle: -270,min: 0,max: 60,animationEasingUpdate: 'bounceOut',clockwise: true,axisLine: {show: false},splitLine: {show: false},axisTick: {show: false},axisLabel: {show: false},pointer: {icon: 'path://M2.9,0.7L2.9,0.7c1.4,0,2.6,1.2,2.6,2.6v115c0,1.4-1.2,2.6-2.6,2.6l0,0c-1.4,0-2.6-1.2-2.6-2.6V3.3C0.3,1.9,1.4,0.7,2.9,0.7z',width: 4,length: '85%',offsetCenter: [0, '8%'],itemStyle: {color: '#C0911F',shadowColor: 'rgba(0, 0, 0, 0.3)',shadowBlur: 8,shadowOffsetX: 2,shadowOffsetY: 4}},anchor: {show: true,size: 15,showAbove: true,itemStyle: {color: '#C0911F',shadowColor: 'rgba(0, 0, 0, 0.3)',shadowBlur: 8,shadowOffsetX: 2,shadowOffsetY: 4}},detail: {show: false},title: {offsetCenter: ['0%', '-40%']},data: [{value: 0}]}]
});const chartInstance = useECharts(chartContainer, options);setInterval(function () {var date = new Date();var second = date.getSeconds();var minute = date.getMinutes() + second / 60;var hour = (date.getHours() % 12) + minute / 60;// options.animationDurationUpdate = 300;chartInstance.value.setOption({series: [{name: 'hour',animation: hour !== 0,data: [{ value: hour }]},{name: 'minute',animation: minute !== 0,data: [{ value: minute }]},{animation: second !== 0,name: 'second',data: [{ value: second }]}]});
}, 1000);// 你可以在这里根据需要操作 ECharts 实例,例如更新数据
// chartInstance.value.setOption({...})</script><style lang='scss' scoped>
* {margin: 0;padding: 0;
}
#chartContainer {position: relative;height: 300px;overflow: hidden;
}</style>

在components中创建组件EChartsGaugeSimple.vue,
代码如下(示例):


<template><div ref="chartContainer" style="width: 100%; height: 100%"></div>
</template><script setup lang="ts" name="">
import { ref } from 'vue';
import useECharts from '@/hooks/useECharts';const chartContainer = ref(null);
const options = ref({tooltip: {formatter: '{a} <br/>{b} : {c}%'},series: [{name: 'Pressure',type: 'gauge',progress: {show: true},detail: {valueAnimation: true,formatter: '{value}'},data: [{value: 50,name: 'SCORE'}]}]
});const chartInstance = useECharts(chartContainer, options);// 你可以在这里根据需要操作 ECharts 实例,例如更新数据
// chartInstance.value.setOption({...})
</script><style lang='scss' scoped>
</style>

两个组件封装好了直接在主页使用:

<div style="height:600px;"><EChartsGaugeSimple></EChartsGaugeSimple></div><div style="height:600px;"><EChartsGaugeClock></EChartsGaugeClock></div>

在这里插入图片描述


总结

把常用的都封装好,这样使用起来方便多了。

千行代码,一 bug 倾城。

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

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

相关文章

【机器学习300问】97、机器学习中哪些是凸优化问题,哪些是非凸优化问题?

在机器学习的领域中&#xff0c;多数模型的参数估计问题实质上可以转化为优化问题。鉴于机器学习模型的多样性&#xff0c;不同的模型会对应着不同的损失函数&#xff0c;进而形成各具特色的优化问题。了解优化问题的形式和特点&#xff0c;对于提升我们求解模型参数的效率和准…

微信好友这样打标签更高效!

为什么要做标签管理? ① 通过标签管理&#xff0c;可以清晰的知道每个私域好友的关系程度&#xff0c;如哪些是忠诚客户&#xff0c;哪些是意向客户&#xff0c;哪些是刚加上的客户等等。 这样就知道下一步要怎么操作&#xff0c;做到精细化运营。如忠诚客户跟进维护&#x…

Embedding 模型的选择和微调

目录 引言 向量模型在 RAG 系统中的作用 1. 对 query 和 私域知识 进行向量化表示 2. 动态更新知识库 3. 数据隐私和安全 有哪些性能不错的向量模型 OpenAI Embedding JinaAI Embedding BAAI/bge Embedding 模型评测 MTEB 排行榜&#xff1a;https://huggingface.co…

第十六节:带你梳理Vue2: 生命周期与钩子函数

前沿: 通过前面几节的学习&#xff0c;我们已经对vue有了初步的了解&#xff0c;大致了解了vue可以帮我们干什么&#xff0c; 那么接下来我们就来看看vue的生命周期和它常用的钩子函数, 1. 理解生命周期的含义 生命周期&#xff1a;就是一个组件从实例化创建并添加到DOM树开…

读论文 | Small object detection model for UAV aerial image based on YOLOv7

目录 1、前言 2、摘要 3、论文的方法 3.1 方法描述 3.2 方法改进 3.3 本论文的模型图 3.4 本文的数据集&#xff1a; 3.5 论文实验 3.6 解决的问题 3.7 论文总结 &#xff08;1&#xff09;文章优点 &#xff08;2&#xff09;方法创新点 &#xff08;3&#xff0…

地质考察AR远程交互展示系统辅助老师日常授课

广东这片充满活力的土地&#xff0c;孕育了一家引领ARVR科技潮流的杰出企业——深圳华锐视点&#xff0c;作为一家专注于VR/AR技术研究与业务开发的先锋公司。多年来&#xff0c;我们不断突破技术壁垒&#xff0c;将AR增强现实技术与各行各业的实际需求完美结合&#xff0c;助力…

Cloneable接口和深拷贝

在java中如何对对象进行拷贝呢&#xff1f;我们可以使用Object类中的clone方法。 一、浅拷贝 在使用clone方法对对象进行拷贝的时候&#xff0c;需要注意&#xff1a; 1.需要重写clone方法&#xff1b; 2.clone方法的返回值是Object类&#xff0c;需要强制类型转化&#xf…

部门来了个测试开发,听说是00后,上来一顿操作给我看蒙了...

公司新来了个同事&#xff0c;听说大学是学的广告专业&#xff0c;因为喜欢IT行业就找了个培训班&#xff0c;后来在一家小公司实习半年&#xff0c;现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍&#xff0c;服务器缩减一半&#xff0c;性能反而提升4倍&#xff01…

阅读笔记——《ProFuzzBench: A Benchmark for Stateful Protocol Fuzzing》

【参考文献】Natella R, Pham V T. Profuzzbench: A benchmark for stateful protocol fuzzing[C]//Proceedings of the 30th ACM SIGSOFT international symposium on software testing and analysis. 2021: 662-665.【注】本文仅为作者个人学习笔记&#xff0c;如有冒犯&…

C++面向对象的第二大特性:继承

1.继承的介绍 首先容我先向大家举一个列子: 我这里定义了一个Person的类 class Person { protected:string name;int age;string address;}; 在这个基础上&#xff0c;我要定义一个关于Student , Worker 的类 由于Student Worker都具有Person类中的成员变量 &#xff0c…

力扣--字符串58.最后一个单词的长度

思路分析 初始化变量: num 用于记录当前单词的长度。before 用于记录上一个单词的长度。 遍历字符串: 如果字符不是空格&#xff0c;增加 num 计数。如果字符是空格&#xff0c;检查 num 是否为 0&#xff1a; 如果 num 为 0&#xff0c;说明之前没有记录到单词&#xff0c;所以…

嵌入式学习——3——UDP TFTP简易文件传输

tftp协议概述 简单文件传输协议&#xff0c;适用于在网络上进行文件传输的一套标准协议&#xff0c;使用UDP传输 特点&#xff1a; 是应用层协议 基于UDP协议实现 数据传输模式 octet&#xff1a;二进制模式&#xff08;常用&#xff09; mail&#xff1a;已经不再支持 TFTP通信…

Qt学习记录(14)线程

前言&#xff1a; 我的臀部已经翘到可以顶起一屁股债了 为什么要使用线程 什么时候用线程 复杂的数据处理 头文件.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer>//定时器头文件QT_BEGIN_NAMESPACE namespace Ui { class Widget; }…

Python+Flask+Pandas怎样实现任意时间范围的对比数据报表

话不多说,有图有源码: 1.上图 2.因为是低代码的,只能发重要有用的代码片段了 实现思路:1)获取指定时间范围内的数据:2)df合并 #----------年份替换----------------for syear in range(int(byear),int(eyear)1):start_datestr(syear)strbdate[4:]end_datestr(syear)stredate…

【大数据】MapReduce JAVA API编程实践及适用场景介绍

目录 1.前言 2.mapreduce编程示例 3.MapReduce适用场景 1.前言 本文是作者大数据系列专栏的其中一篇&#xff0c;前文我们依次聊了大数据的概论、分布式文件系统、分布式数据库、以及计算引擎mapreduce核心概念以及工作原理。 书接上文&#xff0c;本文将会继续聊一下mapr…

光源亮度检测应用笔记

光源亮度检测应用笔记 光电检测应用光电二极管等效模型和基本参数连接并联电阻&#xff08;RJ&#xff09;串联电阻&#xff08;RS&#xff09;结电容&#xff08;CJ&#xff09;暗电流&#xff08;ID&#xff09; 光电二极管电流-电压转换器无源光电二极管电流-电压转换器有源…

C++ Primer 第五版 第十三章 拷贝控制

当定义一个类时&#xff0c;我们显式地或隐式地指定在此类型的对象拷贝、移动、赋值和销毁时做什么。一个类通过定义五种特殊的成员函数来控制这些操作&#xff0c;包括&#xff1a;拷贝构造函数&#xff08;copy constructor&#xff09;、拷贝赋值运算符&#xff08;copy-ass…

柯桥职场人出差必备的商务口语-职场差旅口语提问篇

May I reconfirm my flight? 我可以确认我的班机15857575376吗&#xff1f; Where can I make a reservation? 我到哪里可以预订&#xff1f; Do I have to make a reconfirmation? 我还要再确认吗&#xff1f; Is there any discount for the USA Railpass? 火车通行…

node.js —— 解读http模块

目录 http模块&#xff1a; http模块的引入&#xff1a; 创建web服务器的基本步骤&#xff1a; web服务器的一些基本属性&#xff1a; 上述知识汇总案例&#xff1a; http模块&#xff1a; http模块的引入&#xff1a; const http require (http) 创建web服务器的基本步骤…

探索未来,与移动云共舞

探索未来&#xff0c;与移动云共舞 在数字化飞速发展的今天&#xff0c;云计算已经成为企业、政府乃至个人用户不可或缺的一部分。而在众多云服务提供商中&#xff0c;移动云凭借其独特的优势&#xff0c;为用户带来前所未有的体验。接下来&#xff0c;让我们一起走进移动云的世…