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.rhkb.cn/news/331109.html

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

相关文章

从零起航,Python编程全攻略

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、Python入门之旅 二、Python进阶之道 三、Python爬虫实战 四、Python数据分析利器 五…

linux系统——终止进程命令

linux进程&#xff0c;有所谓进程树的概念&#xff0c;在此之上&#xff0c;有父进程与子进程 pgrep进程名可以查看进程信息 同时&#xff0c;此命令也可以使用参数进行调节 关于kill有一系列命令参数 echo $?可以输出上次命令执行的情况

【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理&#xff0c;以及遇到的困难和总结 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 什么是搜索引…

Ajax异步删除

在页面上定义一个按钮 <button type"button" class"btn"><a href"JavaScript:;" class"id" b_id"{{$attachment[id]}}">删除</a></button> js代码 <script>$(.id).click(function (){va…

[读论文]精读Self-Attentive Sequential Recommendation

论文链接&#xff1a;https://arxiv.org/abs/1808.09781 其他解读文章&#xff1a;https://mp.weixin.qq.com/s/cRQi3FBi9OMdO7imK2Y4Ew 摘要 顺序动态是许多现代推荐系统的一个关键特征&#xff0c;这些系统试图根据用户最近执行的操作来捕获用户活动的“上下文”。为了捕捉…

ES基础概念

本文不介绍如何使用ES&#xff08;使用ES见&#xff1a;&#xff09; 1.ES生态圈 ES&#xff1a; Logstash&#xff1a;数据处理服务程序&#xff0c;解析转换加工数据&#xff1b; Kibana&#xff1a;数据展示、集群管理&#xff0c;数据可视化、ES管理与监控、报表等&#xf…

区块链钱包如果丢失了私钥或助记词,资产还能恢复吗?

如果你丢失了区块链钱包的私钥或助记词&#xff08;通常是用于恢复钱包的短语或种子&#xff09;&#xff0c;那么你的资产在大多数情况下是无法恢复的。私钥是访问和控制你在区块链上资产的唯一凭证&#xff0c;而助记词&#xff08;如BIP39标准中的12、18、24个单词的短语&am…

【数据分析面试】53.推送消息的分布情况(SQL)

题目 我们有两个表&#xff0c;一个是 notification_deliveries 表&#xff0c;另一个是包含 created 和购买 conversion dates 的 users 表。如果用户没有购买&#xff0c;那么 conversion_date 列为 NULL。 编写一个查询&#xff0c;以获取用户转换前的推送通知总数的分布情…

无人机监测系统:天空之眼,精准掌握地球脉动

在当今信息化快速发展的时代&#xff0c;无人机技术以其独特的优势&#xff0c;正在成为资源调查、环境监测和规划支持的重要工具。无人机监测系统通过搭载多种传感器和设备&#xff0c;能够快速、高效地获取地表信息&#xff0c;为决策提供科学依据。 项目背景 随着全球环境…

SpringMVC接收请求参数的方式:

接收简单变量的请求参数 直接使用简单变量作为形参进行接收&#xff08;这里简单变量名称需要与接收的参数名称保持一致&#xff0c;否则需要加上RequestParam注解&#xff09;&#xff1a; 细节&#xff1a; 1&#xff1a;SpringMVC会针对常见类型&#xff08;八种基本类型及…

二叉排序树的创建

二叉排序树就是节点经过排序构建起的二叉树&#xff0c;其有以下性质&#xff1a; 1. 若它的左子树不为空&#xff0c;则左子树上所有节点的值均小于它的根节点的值。 2. 若它的右子树不为空&#xff0c;则右子树上所有节点的值均大于它的根节点的值。 3. 它的左、右子树也分…

python期末作业:批量爬取站长之家的网站排行榜数据并保存,数据分析可视化

爬虫作业,含python爬取数据和保存文件,数据分析使用pyecharts做数据可视化 整体上分析网站的排名,直观看各个网站的热度。 数据分析之后大致的效果: 整个项目分为两个大的部分,第一部分就是抓取网站排名数据,然后保存为Excel、csv等格式,其次就是从文件中…

下一代Docker会让部署更丝滑吗

下一代Docker会让部署更丝滑吗 如何通俗易懂的理解DockerDocker有什么缺点Docker与AI结合&#xff0c;会让部署更加丝滑吗 随着互联网技术的不断发展&#xff0c;单机系统已经无法满足日益正常的用户量以及正常处理用户请求&#xff0c;这个时候就需要进行多机部署&#xff0c;…

设计新境界:大数据赋能UI的创新美学

设计新境界&#xff1a;大数据赋能UI的创新美学 引言 随着大数据技术的蓬勃发展&#xff0c;它已成为推动UI设计创新的重要力量。大数据不仅为界面设计提供了丰富的数据资源&#xff0c;还赋予了设计师以全新的视角和工具来探索美学的新境界。本文将探讨大数据如何赋能UI设计…

使用Datav,echarts开发各种地图

一、功能描述 在实际中&#xff0c;有时候需要针对不同的地图进行开发&#xff0c;而能在网上找到现成&#xff0c;与需要匹配度高的&#xff0c;几乎很难&#xff0c;而且找起对应的资源也相对麻烦。所以结合DataV提供的地图数据&#xff0c;就能开发出各种地图&#xff0c;然…

英语学习笔记25——Mrs. Smith‘s kitchen

Mrs. Smith’s kitchen 史密斯太太的厨房 词汇 Vocabulary Mrs. 夫人【已婚】 复习&#xff1a;Mr. 先生 全名 / 姓    Mrs. 夫人 全名 / 丈夫的姓    Miss 小姐&#xff08;未婚&#xff09; 全名 / 姓    Ms. 女士 全名 / 姓 查看婚姻状况&#xff0c;可以观察…

神经网络的工程基础(零)——PyTorch基础

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文涉及到的代码链接如下&#xff1a;regression2chatgpt/ch06_optimizer/gradient_descent.ipynb 本文将介绍PyTorch的基础。…

速看!!!24上软考-信息系统项目管理师真题回忆,考点已更新

整理了24上半年软考高级信息系统项目管理师的考试真题&#xff0c;软考一个批次一套题&#xff0c;现在都是机考&#xff0c;收集题目比较困难&#xff0c;希望能给个小小的赞支持一下。 注意&#xff1a;当天考试的宝子们可以对答案预估分数&#xff01;后面场次的宝子可以提…

WordPress搭建流程

1. 简介 WordPress 是一个 PHP 编写的网站制作平台。WordPress 本身免费,并且拥有众多的主题可以使用,适合用于搭建个人博客、公司官网、独立站等。 2. 环境准备 2.1 WordPress 下载 WordPress 可以在 Worpress中文官网 下载(如果后续要将后台调成中文的话,一定要从中文…

idea中显示git的Local Changes

1. 第一打开idea中的Settings文件 2. 找到Version Contro中的commint 3. 取消勾选应用即可 4. 本地提交就会显示出来