封装echarts组件,即插即用(附源码)

前言:最近一个项目刚收工,分享一个常用的封装echarts的组件。

一、直接上组件代码

<template><el-card class="echart-card" shadow="hover"><template v-slot:header><div class="card-header"><div class="card-header-title"><componentclass="icon":is="headerIcon"theme="filled"size="16":strokeWidth="3"fill="#333"/><span :class="titleStyle === 'small' ? 'title' : 'titleBig'" style="fontWeight:'bold">{{title}}</span></div><div class="card-header-right"><slot name="header-right"></slot></div></div></template><div class="echarts" ref="chartContainer" :id="`echarts${index}`" :style="style"></div></el-card>
</template>
<script setup>
import debounce from "lodash/debounce";
import {onMounted,ref,reactive,computed,watch,onBeforeUnmount,nextTick,
} from "vue";
// import { useStore } from 'vuex';
// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
import * as echarts from "echarts/core";
import { GraphicComponent } from "echarts/components";
// 引入柱状图图表,图表后缀都为 Chart
import theme from "./theme.json";
import {BarChart,CandlestickChart,FunnelChart,GaugeChart,LineChart,PieChart,RadarChart,ScatterChart,GraphChart,LinesChart,TreemapChart
} from "echarts/charts";
// 引入提示框,标题,直角坐标系组件,组件后缀都为 Component
import {TitleComponent,TooltipComponent,GridComponent,LegendComponent,ToolboxComponent,MarkPointComponent,MarkLineComponent,
} from "echarts/components";
// 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
import { CanvasRenderer } from "echarts/renderers";// 注册必须的组件
echarts.use([TitleComponent,TooltipComponent,GridComponent,BarChart,LineChart,PieChart,RadarChart,GaugeChart,CandlestickChart,ScatterChart,CanvasRenderer,LegendComponent,ToolboxComponent,MarkPointComponent,MarkLineComponent,FunnelChart,GraphicComponent,GraphChart,LinesChart,TreemapChart
]);const props = defineProps({// 图表下标 同个页面有多个图表时,必填index: {type: Number,default: 0,},title: {type: String,default: "标题",},headerIcon: {type: String,default: "icon-full-screen",},style: {type: Object,default: () => {return {width: "100%",height: "380px",};},},options: {type: Object,default: () => {return {};},},grid: {type: Object,default: () => {return {top: "10px",left: 0,right: "1px",bottom: 0,containLabel: true,};},},titleStyle: {type: String,default: "small",},
});let chart = null;
const chartContainer =ref(null)
let timer = ref(null);
//组件挂载完成后执行的钩子函数
onMounted(() => {window.addEventListener("resize",debounce(() => {chart.resize(); //页面大小变化后Echarts也更改大小}, 200));
});
//组件卸载之前执行的钩子函数
onBeforeUnmount(() => {clearTimeout(timer);timer = null;
});
const initChart = () => {if(chartContainer.value){if(chart){chart.dispose()}echarts.registerTheme("wonderland", theme);// chart = echarts.init(document.getElementById("echarts" + props.index), theme);chart = echarts.init(chartContainer.value, theme);// 绘制图表chart.setOption({grid: props.grid,...props.options,});}};watch(() => props.options, //监听() => {nextTick(() => {initChart();});},{deep: true,immediate: true,}
);
</script>
<style lang="scss" scoped>
.echart-card {border-radius: 10px;.card-header {display: flex;align-items: center;justify-content: space-between;&-title {display: flex;align-content: center;align-items: center;color: #606266;.icon {display: flex;padding-right: 5px;}}}.echarts {margin: 0 auto;background-color: #928f8f;}
}
</style>

二、theme.json统一风格

{"color": ["#007FC6", "#00A0F9", "#2BC7E2", "#EA7C13", "#FFB56E", "#FFE8D1"],"backgroundColor": "rgba(255,255,255,0)","textStyle": {},"title": {"textStyle": {"color": "#666666"},"subtextStyle": {"color": "#999999"}},"line": {"itemStyle": {"borderWidth": "2"},"lineStyle": {"width": "3"},"symbolSize": "8","symbol": "emptyCircle","smooth": false},"radar": {"itemStyle": {"borderWidth": "2"},"lineStyle": {"width": "3"},"symbolSize": "8","symbol": "emptyCircle","smooth": false},"bar": {"itemStyle": {"barBorderWidth": 0,"barBorderColor": "#cccccc"}},"pie": {"itemStyle": {"borderWidth": 0,"borderColor": "#cccccc"}},"scatter": {"itemStyle": {"borderWidth": 0,"borderColor": "#cccccc"}},"boxplot": {"itemStyle": {"borderWidth": 0,"borderColor": "#cccccc"}},"parallel": {"itemStyle": {"borderWidth": 0,"borderColor": "#cccccc"}},"sankey": {"itemStyle": {"borderWidth": 0,"borderColor": "#cccccc"}},"funnel": {"itemStyle": {"borderWidth": 0,"borderColor": "#cccccc"}},"gauge": {"itemStyle": {"borderWidth": 0,"borderColor": "#cccccc"}},"candlestick": {"itemStyle": {"color": "#84a2fe","color0": "transparent","borderColor": "#84a2fe","borderColor0": "#22c3aa","borderWidth": "1"}},"graph": {"itemStyle": {"borderWidth": 0,"borderColor": "#cccccc"},"lineStyle": {"width": "1","color": "#cccccc"},"symbolSize": "8","symbol": "emptyCircle","smooth": false,"color": ["#84a2fe", "#22c3aa", "#7bd9a5", "#d0648a", "#08a17e", "#f2b3c9"],"label": {"color": "#ffffff"}},"map": {"itemStyle": {"areaColor": "#eeeeee","borderColor": "#999999","borderWidth": 0.5},"label": {"color": "#28544e"},"emphasis": {"itemStyle": {"areaColor": "rgba(34,195,170,0.25)","borderColor": "#22c3aa","borderWidth": 1},"label": {"color": "#349e8e"}}},"geo": {"itemStyle": {"areaColor": "#eeeeee","borderColor": "#999999","borderWidth": 0.5},"label": {"color": "#28544e"},"emphasis": {"itemStyle": {"areaColor": "rgba(34,195,170,0.25)","borderColor": "#22c3aa","borderWidth": 1},"label": {"color": "#349e8e"}}},"categoryAxis": {"axisLine": {"show": true,"lineStyle": {"color": "#cccccc"}},"axisTick": {"show": false,"lineStyle": {"color": "#333"}},"axisLabel": {"show": true,"color": "#999999"},"splitLine": {"show": true,"lineStyle": {"color": ["#eeeeee"]}},"splitArea": {"show": false,"areaStyle": {"color": ["rgba(250,250,250,0.05)", "rgba(200,200,200,0.02)"]}}},"valueAxis": {"axisLine": {"show": true,"lineStyle": {"color": "#cccccc"}},"axisTick": {"show": false,"lineStyle": {"color": "#333"}},"axisLabel": {"show": true,"color": "#999999"},"splitLine": {"show": true,"lineStyle": {"color": ["#eeeeee"]}},"splitArea": {"show": false,"areaStyle": {"color": ["rgba(250,250,250,0.05)", "rgba(200,200,200,0.02)"]}}},"logAxis": {"axisLine": {"show": true,"lineStyle": {"color": "#cccccc"}},"axisTick": {"show": false,"lineStyle": {"color": "#333"}},"axisLabel": {"show": true,"color": "#999999"},"splitLine": {"show": true,"lineStyle": {"color": ["#eeeeee"]}},"splitArea": {"show": false,"areaStyle": {"color": ["rgba(250,250,250,0.05)", "rgba(200,200,200,0.02)"]}}},"timeAxis": {"axisLine": {"show": true,"lineStyle": {"color": "#cccccc"}},"axisTick": {"show": false,"lineStyle": {"color": "#333"}},"axisLabel": {"show": true,"color": "#999999"},"splitLine": {"show": true,"lineStyle": {"color": ["#eeeeee"]}},"splitArea": {"show": false,"areaStyle": {"color": ["rgba(250,250,250,0.05)", "rgba(200,200,200,0.02)"]}}},"toolbox": {"iconStyle": {"borderColor": "#999999"},"emphasis": {"iconStyle": {"borderColor": "#666666"}}},"legend": {"textStyle": {"color": "#999999"}},"tooltip": {"axisPointer": {"lineStyle": {"color": "#cccccc","width": 1},"crossStyle": {"color": "#cccccc","width": 1}}},"timeline": {"lineStyle": {"color": "#84a2fe","width": 1},"itemStyle": {"color": "#84a2fe","borderWidth": 1},"controlStyle": {"color": "#84a2fe","borderColor": "#84a2fe","borderWidth": 0.5},"checkpointStyle": {"color": "#84a2fe","borderColor": "#3cebd2"},"label": {"color": "#84a2fe"},"emphasis": {"itemStyle": {"color": "#84a2fe"},"controlStyle": {"color": "#84a2fe","borderColor": "#84a2fe","borderWidth": 0.5},"label": {"color": "#84a2fe"}}},"visualMap": {"color": ["#d0648a", "#22c3aa", "#adfff1"]},"dataZoom": {"backgroundColor": "rgba(255,255,255,0)","dataBackgroundColor": "rgba(222,222,222,1)","fillerColor": "rgba(114,230,212,0.25)","handleColor": "#cccccc","handleSize": "100%","textStyle": {"color": "#999999"}},"markPoint": {"label": {"color": "#ffffff"},"emphasis": {"label": {"color": "#ffffff"}}}
}

 可以直接将以上两个代码复制到组件文件夹里面

三、使用该组件

        <EchartsComtitle="协议流量趋势图":index="11":titleStyle="'big'"headerIcon="icon-chart-line":style="{ height: '250px' }":options="{tooltip: trendSeries.tooltip,series: trendSeries.series,xAxis: trendSeries.xAxis,yAxis: trendSeries.yAxis,grid: trendSeries.grid,}"></EchartsCom>

 可以很清楚的看到,其实主要就是传echarts的配置。

配置代码(就以折线图举例):

const trendSeries = ref({grid: { top: '15%', bottom: '5%', left: '10%', right: '18%', containLabel: true },tooltip: {trigger: 'axis',axisPointer: {type: 'line',},},series: {type: 'line',data: [120, 132, 101, 134, 90, 230, 210],symbol: 'circle',lineStyle: {normal: {color: '#008FFF',},},symbolSize: 10,itemStyle: {normal: {color: '#fff',borderColor: '#008FFF',},borderRadius: [30, 30, 0, 0],shadowColor: 'rgb(255,255,255)',shadowBlur: 4,},smooth: false,},xAxis: {name: '时间',type: 'category',data: ['2024-04-18','2024-04-19','2024-04-20','2024-04-21','2024-04-22','2024-04-23','2024-04-24',],splitLine: {show: false,},axisLabel: {color: '#002745',},},yAxis: {name: '单位(次)',type: 'value',minInterval: 1,splitLine: {show: true,lineStyle: {width: 2,type: 'dashed',},},axisLine: {show: false,},axisLabel: {show: true,formatter(v) {v = v.toString();if (v >= 100000000000) {return v.substring(0, 5) / 10 + '亿';} else if (v >= 10000000000) {return v.substring(0, 4) / 10 + '亿';} else if (v >= 1000000000) {return v.substring(0, 3) / 10 + '亿';} else if (v >= 100000000) {return v.substring(0, 2) / 10 + '亿';} else if (v >= 10000000) {return v.substring(0, 4) + '万';} else if (v >= 1000000) {return v.substring(0, 3) + '万';} else if (v >= 100000) {return v.substring(0, 2) + '万';} else if (v >= 10000) {return v.substring(0, 2) / 10 + '万';} else if (v >= 1000) {return v;} else {return v;}},},},});

效果展示:

如果想用饼图、柱状图之类的就可以直接传相应的配置即可,这样可以灵活控制每个图的不用样式。

之前我封装过几个组件都是把echarts的配置写进组件里面,但是后面发现如果一个页面需要七八个echarts图表,并且样式都是不一样的,那么就比较适用该文介绍的封装方法。

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

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

相关文章

JS面试八股文(三)

&#x1f60a;文章目录 21.说一下事件循环22.ajax是什么&#xff1f;怎么实现&#xff1f;23.get和post有什么区别&#xff1f;24.Promise的内部原理是什么&#xff1f;它的缺点是什么&#xff1f;25.Promise和async await的区别是什么&#xff1f;26.浏览器的存储方式有哪些&a…

python实战(二)——房屋价格回归建模

一、任务背景 本章将使用一个经典的Kaggle数据集——House Prices - Advanced Regression Techniques进行回归建模的讲解。这是一个房价数据集&#xff0c;与我们熟知的波士顿房价数据集类似&#xff0c;但是特征数量要更多&#xff0c;数据也要更为复杂一些。下面&#xff0c;…

Linux 命令行查看当前目录的总大小/总磁盘空间/磁盘清理

一、du 查看目录空间大小 &#xff08;一&#xff09; du 命令解析 在Linux命令行可以使用 du 命令来查看当前目录的总大小。du 是 disk usage 的缩写&#xff0c;表示磁盘使用情况。 命令解释&#xff1a;总结每个文件的磁盘使用情况&#xff0c;递归地用于目录。 使用格式…

以通俗易懂的仓库来讲解JVM内存模型

JVM内存模型可以想象成一个大型的仓库&#xff0c;这个仓库被分成了几个不同的区域&#xff0c;每个区域都有特定的用途和规则。下面我们用一个仓库的比喻来介绍JVM内存模型&#xff1a; 仓库大门&#xff08;JVM启动&#xff09;&#xff1a; 当JVM启动时&#xff0c;就像打开…

自动化抖音点赞取消脚本批量处理

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

多个立方体盒子组成

效果&#xff1a; 知识了解&#xff1a; 在同一水平上&#xff0c;盒子经纬度计算&#xff1a;经度有误差&#xff0c;纬度没有误差 纬度计算&#xff1a;lat50/111320 约等于0.000449 经度计算&#xff1a;lon50/111320*cos(纬度) 约等于0.000519 一个立方体&#xff1a; // 添…

CentOS进入单用户模式进行密码重置

一、单用户模式介绍 单用户模式是一种特殊的启动模式&#xff0c;主要用于系统维护和故障排除。在单用户模式下&#xff0c;系统以最小化的状态启动&#xff0c;只有最基本的系统服务会被加载&#xff0c;通常只有root用户可以登录。这种模式提供了对系统的完全控制&#xff0…

模型训练识别手写数字(一)

一、模型训练数据集 1. 导入所需库 import numpy as np from sklearn.datasets import fetch_openmlnumpy 是用于数值计算的库。 fetch_openml 是用于从 OpenML 下载数据集的函数。 2. 获取 MNIST 数据集 X, y fetch_openml(mnist_784, version1, return_X_yTrue)fetch_ope…

Spring Boot与Flyway实现自动化数据库版本控制

一、为什么使用Flyway 最简单的一个项目是一个软件连接到一个数据库&#xff0c;但是大多数项目中我们不仅要处理我们开发环境的副本&#xff0c;还需要处理其他很多副本。例如&#xff1a;开发环境、测试环境、生产环境。想到数据库管理&#xff0c;我们立刻就能想到一系列问…

Ovis原理解读: 多模态大语言模型的结构嵌入对齐

论文&#xff1a;https://arxiv.org/pdf/2405.20797 github:https://github.com/AIDC-AI/Ovis 在多模态大语言模型 (MLLM) 中&#xff0c;不同的嵌入策略有显著的区别。以下是使用基于连接器的方法与 Ovis 方法的比较&#xff1a; 基于连接器的方法-优缺点(connector-based …

斜杠往哪斜、路径绝对还是相对,终端目录切换不再迷茫

目录 路径表示绝对路径相对路径两者区别 路径中斜杠的用法正反斜杠对比表一个常见的问题 终端切换目录常用cd指令同一盘符内跨盘符 路径表示 在计算机文件系统中&#xff0c;路径是用来指定文件或目录位置的一种方式。路径可以是绝对路径或相对路径&#xff1a; 绝对路径 绝…

cmake 编译 vtk

1. 下载 VTK 源码 vtk 源码&#xff0c;点击&#xff1a;官网下载 在官网选择合适的版本下载&#xff0c;这里下载的是 vtk 8.2.0 版本 2. 下载 CMake CMake 工具&#xff0c;点击&#xff1a;镜像下载 下载版本比较新的 CMake 版本&#xff0c;这里使用的是 CMake 3.29.2 版…

在不支持AVX的linux上使用PaddleOCR

背景 公司的虚拟机CPU居然不支持avx, 默认的paddlepaddle的cpu版本又需要有支持avx才行,还想用PaddleOCR有啥办法呢? 是否支持avx lscpu | grep avx 支持avx的话,会显示相关信息 如果不支持的话,python运行时导入paddle会报错 怎么办呢 方案一 找公司it,看看虚拟机为什么…

C++基础:constexpr,类型转换和选择语句

constexpr 提到constexpr&#xff0c;我们会发现它和const类比 常和const类比constexpr符号常量必须给定一个在编译时已知的值&#xff0c; 若某个变量初始化时的值在编译时未知&#xff0c;但初始化后绝不变。 #include<iostream> #include<vector> #include&l…

【机器学习基础】激活函数

激活函数 1. Sigmoid函数2. Tanh&#xff08;双曲正切&#xff09;函数3. ReLU函数4. Leaky ReLU函数 1. Sigmoid函数 观察导数图像在我们深度学习里面&#xff0c;导数是为了求参数W和B&#xff0c;W和B是在我们模型model确定之后&#xff0c;找出一组最优的W和B&#xff0c;使…

Go使用exec.Command() 执行脚本时出现:file or directory not found

使用 Go 提供的 exec.Command() 执行脚本时出现了未找到脚本的 bug&#xff0c;三个排查思路 &#xff1a; exec.Command(execName, args…) 脚本名字不允许相对路径 exec.Command(execName, args…) execName 只能有脚本名&#xff0c;不允许出现参数 如果你是使用 Windows …

Python爬虫:商品详情的“八卦记者”

亲爱的代码侦探们&#xff0c;今天咱们不聊那些让人头秃的bug&#xff0c;也不谈那些让人眼花的架构图。咱们来聊聊那些在代码世界里挖掘商品秘密的“八卦记者”——Python爬虫。 Python爬虫&#xff1a;商品详情的“八卦记者” 想象一下&#xff0c;你在代码的世界里&#xf…

[笔记] ffmpeg docker编译环境搭建

文章目录 环境参考dockerfile 文件步骤常见问题docker 构建镜像出现 INTERNAL_ERROR 失败? 总结 环境 docker 环境 系统centos 7.9 (无所谓了 你用docker编译就无所谓系统了) ffmpeg3.3 参考 https://blog.csdn.net/jiedichina/article/details/71438112 dockerfile 文件 …

《等保测评新视角:安全与发展的双赢之道》

在数字化转型的浪潮中&#xff0c;企业面临的不仅是技术革新的挑战&#xff0c;更有信息安全的严峻考验。等保测评&#xff0c;作为国家网络安全等级保护的一项重要措施&#xff0c;不仅为企业的安全护航&#xff0c;更成为推动企业高质量发展的新引擎。本文将从全新的视角&…

如何将markdown文件转换为pdf

最近笔者在用vscode写markdown&#xff0c;但是提交时往往需要交pdf。所以就涉及到如何将markdown转化为pdf格式。 首先&#xff0c;需要在vscode上安装插件 markdown Preview Enhanced 之后在vscode的右上角即可看到下述图标&#xff0c;点击&#xff0c;vscode右半面就会显示…