用vue3封装自用的echarts组件

封装的组件

目录

  • 封装的组件
  • 在项目中使用

BaseChart.vue

<script setup>import {ref,onMounted,onBeforeUnmount,watch,markRaw} from 'vue';import {debounce} from "@/utils"; //节流函数 import * as echarts from "echarts";const emit = defineEmits(['chartClick', 'chartMouseover', 'chartMouseout'])const props = defineProps({option: {type: Object,defined: () => {}},width: {type: String,defined: '100%'}, // 必须指定容器的宽高,否则无法显示。(容器内图表会自动获取父元素宽高)height: {type: String,defined: '100%'},theme: {type: [Object, String],defined: ''},loading: {type: Boolean,defined: false}, // 受控onMouseover: {type: Function,defined: () => {}},onMouseout: {type: Function,defined: () => {}},onClick: {type: Function,defined: () => {}}})const chartRef = ref(null);const chartInstance = ref();const draw = () => {if (chartInstance.value) {// console.log('修改了', props.option);chartInstance.value.setOption(props.option, {notMerge: true});}};const init = () => {if (!chartRef.value) return;// 校验 Dom 节点上是否已经挂载了 ECharts 实例,只有未挂载时才初始化chartInstance.value = echarts.getInstanceByDom(chartRef.value);if (!chartInstance.value) {chartInstance.value = markRaw(echarts.init(chartRef.value, props.theme, {renderer: 'canvas',}));// 绑定鼠标事件:if (props.onMouseover) {chartInstance.value.on('mouseover', (event) => {props.onMouseover(event, chartInstance.value, props.option);});}if (props.onMouseout) {chartInstance.value.on('mouseout', (event) => {props.onMouseout(event, chartInstance.value, props.option);});}if (props.onClick) {chartInstance.value.on('click', (event) => {props.onClick(event, chartInstance.value, props.option);});}chartInstance.value.on('mouseover', (event) => {emit('chartMouseover', event, chartInstance.value, props.option)})chartInstance.value.on('mouseout', (event) => {emit('chartMouseout', event, chartInstance.value, props.option)})chartInstance.value.on('click', (event) => {emit('chartClick', event, chartInstance.value, props.option)})draw();}};// 窗口自适应并开启过渡动画const resize = () => {if (chartInstance.value) {chartInstance.value.resize({animation: {duration: 300}});}};// 自适应防抖优化const debouncedResize = debounce(resize, 500, {maxWait: 800});// 对父组件暴露获取 ECharts 实例的方法,可直接通过实例调用原生函数defineExpose({getInstance: () => chartInstance.value,resize,draw,});watch(props, () => {draw();});// 展示 loading 动画watch(() => props.loading,loading => {loading?chartInstance.value.showLoading() :chartInstance.value.hideLoading();});onMounted(() => {init();window.addEventListener('resize', debouncedResize);});onBeforeUnmount(() => {// 容器被销毁之后,销毁实例,避免内存泄漏chartInstance.value?.dispose();window.removeEventListener('resize', debouncedResize);});
</script><template><div id="echart" ref="chartRef" :style="{ width: props.width, height: props.height }" />
</template>

在项目中使用

注意:如果你要使用渐变颜色还得自己引入echarts

<template><div class="main-box" style="width: 100%;height: 100%;"><!-- :onClick="clickChart"  :onMouseout="onMouseout" :onMouseover="onMouseover"--><!-- @chartClick="clickChart" @chartMouseover="chartMouseover" @chartMouseout="chartMouseout" --><!-- 上面有两种点击事件和鼠标事件 都能使用 --><BaseChart @chartClick="clickChart" width="100%" height="100%" :option="chartOptions"></BaseChart></div>
</template><script setup>import BaseChart from '@/components/BaseChart/index.vue'import {requestGet} from '@/api/index.js'import {onMounted,ref} from 'vue'import * as echarts from "echarts";onMounted(() => {initChart();})const chartOptions = ref({})const clickChart = (e, chart, option) => {console.log('图标数据', e);console.log('图标dom', chart);console.log('图标option', option);}const initChart = async () => {chartOptions.value = {grid: {top: '15%',left: '1%',right: '7%',bottom: '0%',containLabel: true,},legend: {top: '0%',right: '10%',itemGap: 50,data: ['产量', '产值'],textStyle: {color: '#f9f9f9',borderColor: '#fff'},},xAxis: [{name: '年',nameGap: 5,type: 'category',axisLine: { //坐标轴轴线相关设置。数学上的x轴show: true,lineStyle: {color: '#999'},},axisLabel: { //坐标轴刻度标签的相关设置color: '#999',},axisTick: {show: false,},data: ['2017', '2018', '2019', '2020', '2021', '2022', '2023', ],}],yAxis: [{type: 'value',min: 0,// max: 140,splitNumber: 7,splitLine: {show: true,lineStyle: {color: '#0a3256'}},axisLine: {show: false,},axisLabel: {// margin: 20,color: '#999',},axisTick: {show: false,},}],tooltip: {trigger: 'axis',},series: [{name: '产量',type: 'line',// smooth: true, //是否平滑曲线显示// 			symbol:'circle',  // 默认是空心圆(中间是白色的),改成实心圆showAllSymbol: true,symbol: 'emptyCircle',// symbolSize: 6,lineStyle: {color: "#28ffb3", // 线条颜色borderColor: '#f0f'},label: {show: false,position: 'top',color: '#fff',},itemStyle: {color: "#28ffb3",lineStyle: {width: 1,type: 'solid' //'dotted'虚线 'solid'实线}},areaStyle: { //区域填充样式//线性渐变,前4个参数分别是x0,y0,x2,y2(范围0~1);相当于图形包围盒中的百分比。如果最后一个参数是‘true’,则该四个值是绝对像素位置。color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{offset: 0,color: 'rgba(0,154,120,1)'},{offset: 1,color: 'rgba(0,0,0, 0)'}], false),shadowColor: 'rgba(53,142,215, 0.9)', //阴影颜色shadowBlur: 20 //shadowBlur设图形阴影的模糊大小。配合shadowColor,shadowOffsetX/Y, 设置图形的阴影效果。},data: [393, 438, 485, 631, 689, 824, 987]}, {name: '产值',type: 'bar',barWidth: 15,// tooltip: {//   show: false// },label: {show: false,position: 'top',color: '#fff',},itemStyle: {color: "#1cfffb",lineStyle: {width: 1,type: 'solid' //'dotted'虚线 'solid'实线},//  barBorderRadius: [30, 30, 0, 0],},}]};}</script><style scoped lang="scss">.main-box {width: 100%;height: 100%;}.main-content {width: 100%;height: 100%;}
</style>```

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

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

相关文章

TSINGSEE青犀边缘AI计算基于车辆结构化数据的车辆监控方案

随着人工智能技术的不断发展&#xff0c;边缘AI技术逐渐成为智能交通领域的研究热点。其中&#xff0c;基于边缘AI的车辆结构化数据技术与车辆监控系统是实现智能交通系统的重要手段之一。为了满足市场需求&#xff0c;TSINGSEE青犀边缘AI智能分析网关/视频智能分析平台推出了一…

windows安装库报错

报错信息 ERROR: Command errored out with exit status 1: ‘D:\test\venv\Scripts\python.exe’ -u -c ‘import io, os, sys, setuptools, tokenize; sys.argv[0] ‘"’"‘C:\Users\aaa\AppData\Local\Temp\pip-install-j oni55ju\xxx_350c8d1094f749eb97d8f049…

《代码随想录》--二叉树(一)

《代码随想录》--二叉树 第一部分 1、二叉树的递归遍历2、二叉树的迭代遍历3、统一风格的迭代遍历代码4、二叉树的层序遍历226.翻转二叉树 1、二叉树的递归遍历 前序遍历 中序遍历 后序遍历 代码 前序遍历 class Solution {public List<Integer> preorderTraversal(T…

阿里云国际版CDN查询实时带宽步骤

调用DescribeDomainRealTimeBpsData查询加速域名的带宽数据。 接口说明 单用户调用频率&#xff1a;100次/秒。如果您不指定StartTime和EndTime&#xff0c;该接口默认返回过去1小时的数据&#xff1b;指定StartTime和EndTime&#xff0c;该接口返回指定时间段的数据。 返回…

opencv 入门二(播放视频)

环境配置如下&#xff1a; opencv 入门一&#xff08;显示一张图片&#xff09;-CSDN博客 用OpenCV播放视频就像显示图像一样简单。唯一不同的是&#xff0c;我们需要某种循环来读取视频序列中的每一帧。 源码如下&#xff1a; #include <iostream> #include <str…

实时时钟(RTC)的选择与设计:内置晶体与外置晶体的优缺点对比

实时时钟(RTC)作为一种具备独立计时和事件记录功能的设备&#xff0c;现已广泛应用于许多电子产品中&#xff0c;并对时钟的精度要求越来越高。根据封装尺寸、接口方式、附加功能、时钟精度和待机功耗等因素进行分类&#xff0c;市场上有各种种类的RTC产品可供选择。 而在设计…

epi 外延炉 简介

因半导体制造工艺复杂&#xff0c;各个环节需要的设备也不同&#xff0c;从流程工序分类来看&#xff0c;半导体设备主要可分为晶圆制造设备&#xff08;前道工序&#xff09;、封装测试设备&#xff08;后道工序&#xff09;等。 本文介绍影响着晶体管性能和可靠性的外延炉。 …

C#调用阿里云接口实现动态域名解析,支持IPv6(Windows系统下载可用)

电信宽带一般能申请到公网IP&#xff0c;但是是动态的&#xff0c;基本上每天都要变&#xff0c;所以想到做一个定时任务&#xff0c;随系统启动&#xff0c;网上看了不少博文很多都支持IPv4&#xff0c;自己动手写了一个。 &#xff08;私信可全程指导&#xff09; 部署步骤…

衡量芯片运算能力的指标

MACCs MACCs&#xff08;Multiply-accumulate operations&#xff09;表示乘加运算&#xff1a;b乘c加a为一次MACC指令&#xff0c;两次OP。 乘加运算是模型运算里的基本单元&#xff0c;矩阵的运算基本都是乘加。 TOPS TOPS&#xff08;Tera Operation Per Second&#xf…

QT isEnable、isSelected、setEnabled 、 setClickable

isEnable&#xff1a;是否启用部件的键盘和鼠标事件 isSelected&#xff1a;判断某个元素是否被选中 setEnabled 和setClickable参考&#xff1a; qt -- setEnabled() 、 setClickable()_qt setenabled-CSDN博客 void SwitchButton::mousePressEvent(QMouseEvent *event) {…

Vue 使用 js-audio-recorder 实现录制、播放、下载音频

Vue 使用 js-audio-recorder 实现录制、播放、下载 PCM 数据 Vue 使用 js-audio-recorder 实现录制、播放、下载 PCM 数据js-audio-recorder 简介Vue 项目创建下载相关依赖主界面设计设置路由组件及页面设计项目启动源码下载 Vue 使用 js-audio-recorder 实现录制、播放、下载 …

FPGA时序分析与时序约束(二)——时钟约束

目录 一、时序约束的步骤 二、时序网表和路径 2.1 时序网表 2.2 时序路径 三、时序约束的方式 三、时钟约束 3.1 主时钟约束 3.2 虚拟时钟约束 3.3 衍生时钟约束 3.4 时钟组约束 3.5 时钟特性约束 3.6 时钟延时约束 一、时序约束的步骤 上一章了解了时序分析和约束…

IDEA shorten command line介绍和JAR manifest 导致mybatis找不到接口类处理

如果类路径太长&#xff0c;或者有许多VM参数&#xff0c;程序就无法启动。原因是大多数操作系统都有命令行长度限制。在这种情况下&#xff0c;IntelliJIDEA将试图缩短类路径。最好选中 classpath file模式。 shorten command line 选项提供三种选项缩短类路径。 none&#x…

破局:国内母婴市场“红利减退”,母婴店如何拓客引流裂变?

破局&#xff1a;国内母婴市场“红利减退”&#xff0c;母婴店如何拓客引流裂变&#xff1f; 背景&#xff1a;中国母婴市场近年来人口出生率一直在恒定范围值&#xff0c;国家也在鼓励优生、多生政策&#xff0c;并且随着互联网的高速发展&#xff0c;人均可支配收入也在增加&…

你是无醇葡萄酒的爱好者吗?

不含酒精的蒸馏酒和起泡酒正在流行&#xff0c;尽管它们是葡萄酒市场中最小的细分市场之一&#xff0c;但需求和供应都在稳步增长。这是因为&#xff0c;和啤酒一样&#xff0c;消费者越来越多地询问无醇葡萄酒。 来自云仓酒庄品牌雷盛红酒分享不含酒精的酒好喝吗&#xff1f;尼…

单通道 6 阶高清视频滤波驱动 MS1631

MS1631 是一个单通道视频缓冲器&#xff0c;它内部集成 6dB 增益的轨到轨输出驱动器和 6 阶输出重建 滤波器。MS1631 的-3dB 带宽典型值为 72MHz&#xff0c;压摆率为 400V/us。MS1631 比无源 LC 滤波器与外加 驱动的解决方案能提供更好的图像质量。它单电源供电范围为2.5V 到…

从零开始学习Web自动化:用Python和Selenium实现网站登录功能!

Web自动化测试实战项目&#xff1a;使用Selenium和Python完成网站登录功能的自动化测试 本文将介绍如何使用Selenium和Python编写自动化测试脚本&#xff0c;对网站登录功能进行测试。我们将通过模拟用户在网站上输入用户名和密码&#xff0c;并点击登录按钮&#xff0c;来检验…

flink yarn-session 启动失败retrying connect to server 0.0.0.0/0.0.0.0:8032

原因分析&#xff0c;启动yarn-session.sh&#xff0c;会向resourcemanager的端口8032发起请求&#xff1a; 但是一直无法请求到8032端口&#xff0c;触发重试机制会不断尝试 备注&#xff1a;此问题出现时&#xff0c;我的环境ambari部署的HA 高可用hadoop&#xff0c;三个节点…

电力智能化管理系统

电力智能化管理系统是一种综合性的电力管理解决方案&#xff0c;它利用先进的信息技术、自动化技术和智能控制技术&#xff0c;实现对电力系统的全面管理和优化。 该系统依托电易云-智慧电力物联网&#xff0c;它的主要功能包括实时监测、故障预警、自动巡检、设备管理、数据分…

【Unity 实用工具篇】✨| I2 Localization 实现本地化及多种语言切换,快速上手

前言【Unity 实用工具篇】| I2 Localization 实现本地化及多种语言切换,快速上手一、多语言本地化插件 I2 Localization1.1 介绍1.2 效果展示1.3 使用说明及下载二、插件资源简单介绍三、通过示例快速上手3.1 添加 Languages语种3.2 添加 Term资源3.3 静