Vue 3 中集成 ECharts(附一些案例)

Vue 3 中集成 ECharts 的完全指南

引言

在现代Web开发中,Vue 3以其卓越的性能和灵活的Composition API赢得了广泛的关注。而ECharts,作为开源的一个使用JavaScript实现的强大可视化库,以其丰富的图表类型和高度可定制性成为了数据可视化的首选工具之一。今天,我们将结合Vue 3的<script setup>语法糖和ECharts,来详细探讨如何在Vue 3项目中集成ECharts,并不仅仅局限于折线图,而是展示一个通用的集成方法。

一、安装和配置

1.安装ECharts

首先,你需要通过npm或yarn来安装ECharts。在你的Vue 3项目根目录下打开终端,执行以下命令之一:

npm install echarts --save
# 或者
yarn add echarts

2. Vue 3项目设置

确保你已经有一个Vue 3项目,并熟悉其基本结构。<script setup>是Vue 3引入的一种新的组件编写方式,它使得组件的编写更加简洁和直观。

二、编写Vue组件

1. 组件结构

在你的Vue 3项目中,创建一个新的组件,比如命名为EChartsComponent.vue。以下是该组件的基本结构,用于展示如何在Vue 3中集成ECharts:

<template><div ref="chartDom" style="width: 600px; height: 400px;"></div>
</template><script setup>
import { ref, onMounted, onUnmounted, nextTick } from 'vue';
import * as echarts from 'echarts';// 创建一个响应式引用来保存DOM元素
const chartDom = ref(null);
let chartInstance = null;// 初始化ECharts实例并设置配置项(这里以折线图为例,但可灵活替换)
onMounted(async () => {await nextTick(); // 确保DOM已经渲染完成chartInstance = echarts.init(chartDom.value);const option = {// 这里是ECharts的配置项,可以根据需要绘制不同类型的图表title: {text: 'ECharts 示例图表'},tooltip: {},xAxis: {data: ["类别1", "类别2", "类别3", "类别4", "类别5"]},yAxis: {},series: [{name: '数据系列',type: 'line', // 这里可以是'line'、'bar'、'pie'等,根据图表类型选择data: [120, 200, 150, 80, 70]}]};chartInstance.setOption(option);
});// 销毁ECharts实例
onUnmounted(() => {if (chartInstance != null && chartInstance.dispose) {chartInstance.dispose();}
});
</script><style scoped>
/* 添加一些CSS样式来美化图表容器(可选) */
</style>

2. 关键点解释

  1. nextTick: 使用await nextTick();来确保Vue的DOM更新已经完成,这是初始化ECharts实例前的关键步骤。

  2. ECharts配置: 配置项option可以根据需要绘制不同类型的图表,如折线图、柱状图、饼图等。通过修改series中的type字段,可以轻松切换图表类型。

  3. 图表初始化与销毁: 在onMounted钩子中初始化ECharts实例,在onUnmounted钩子中销毁实例,以避免内存泄漏。

三、案例

好了,以上咱知道了基础用法,接下来展示几个案例

1. 堆叠柱状图案例

在这里插入图片描述
代码如下

const monthlyIndicators = ref(null);// 绘制柱状图
const drawMonthlyIndicators = () => {const monthlyIndicatorsElement = echarts.init(monthlyIndicators.value);const option = {legend: {data: ['计划', '实际'],icon: 'circle', // 设置图例图标为圆形left: 'left', // 将图例定位到左侧top: 'top', // 将图例定位到顶部},grid: {top: '45', // 距离容器上边界的距离right: '10', // 距离容器右边界的距离bottom: '3', // 距离容器下边界的距离left: '10', // 距离容器左边界的距离containLabel: true, // 包含标签的绘图区域},xAxis: {type: 'category',data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],axisTick: {alignWithLabel: true,},axisLine: {show: false, // 不显示横坐标轴线},axisTick: {show: false, // 不显示刻度线},},yAxis: {type: 'value',boundaryGap: [0, 0.01],},series: [{name: '实际',data: [220, 182, 191, 234, 290, 330, 310, 123, 442, 321, 234, 123],type: 'bar',stack: 'total', // 添加堆积效果barWidth: '30%', // 调整柱子宽度itemStyle: {borderRadius: [5, 5, 0, 0], // 只有顶部圆角color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [// 设置渐变色{ offset: 0, color: '#bdd1f6' },{ offset: 1, color: '#4282ff' },]),},},{name: '计划',data: [320, 132, 101, 134, 90, 230, 210, 320, 132, 101, 134, 90],type: 'bar',stack: 'total', // 添加堆积效果barWidth: '30%', // 调整柱子宽度itemStyle: {borderRadius: [5, 5, 0, 0], // 只有顶部圆角color: '#ebf2ff', // 设置柱子颜色},},],};monthlyIndicatorsElement.setOption(option);
};

2. 渐变折线图

在这里插入图片描述
代码如下

const businessTrends = ref(null);// 绘制折线图
const drawBusinessTrends = () => {const businessTrendsElement = echarts.init(businessTrends.value);const option = {tooltip: {trigger: 'axis',},grid: {left: '3%', // 调整左边距right: '3%', // 调整右边距bottom: '3%', // 调整底部边距top: '5%', // 调整顶部边距containLabel: true, // 确保标签和轴标题被包含在容器内},xAxis: {type: 'category',boundaryGap: false,data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月'], // 示例数据axisLine: {show: false, // 不显示横坐标轴线},axisTick: {show: false, // 不显示刻度线},},yAxis: {type: 'value',axisLabel: {formatter: '{value}',},},series: [{name: '销售额',type: 'line',data: [620, 1032, 701, 1234, 890, 1430, 1120], // 示例数据,模拟起伏更大smooth: true, // 折线平滑lineStyle: {width: 2,color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [{ offset: 0, color: '#62c1fe' },{ offset: 0.5, color: '#ad90f7' },{ offset: 1, color: '#e875f2' },]),},symbolSize: (value, params) => {// 获取数据系列的长度const seriesLength = option.series[0].data.length;// 中间节点放大if (params.dataIndex === Math.floor(seriesLength / 2)) {return 8; // 中间节点的大小}return 8; // 其他节点的大小},},],};businessTrendsElement.setOption(option);
};

3. 环形饼图

在这里插入图片描述
代码如下

const projectSigningOverview = ref(null);// 绘制饼图环形
const drawProjectSigningOverview = () => {const projectSigningOverviewElement = echarts.init(projectSigningOverview.value);const option = {legend: {orient: 'vertical',right: 10,align: 'left',top: 'center',textStyle: {rich: {name: {color: '#929292',},value: {color: '#000',fontWeight: 'bold',fontSize: 16, // 根据需要调整字体大小},},},data: [{name: '已签约 {value|80}{name| 个/5800万}',textStyle: { rich: { value: {}, name: {} } },},{name: '未签约 {value|18}{name| 个/5800万}',textStyle: { rich: { value: {}, name: {} } },},{name: '跟进中 {value|24}{name| 个/5800万}',textStyle: { rich: { value: {}, name: {} } },},],icon: 'circle', // 设置图例图标为圆形},series: [{name: 'Access From',type: 'pie',radius: ['50%', '70%'],center: ['22%', '50%'],avoidLabelOverlap: false,label: {show: false,position: 'center',},emphasis: {label: {show: false,},},labelLine: {show: false,},data: [{ value: 80, name: '已签约 {value|80}{name| 个/5800万}' }, // 已签约{ value: 18, name: '未签约 {value|18}{name| 个/5800万}' }, // 未签约{ value: 24, name: '跟进中 {value|24}{name| 个/5800万}' }, // 跟进中],itemStyle: {borderRadius: 0,borderColor: '#fff',borderWidth: 0,},},],graphic: [{type: 'text',left: '65%', // 将文本水平居中top: '19%', // 根据实际情况调整,确保文本显示在legend上方style: {// 使用富文本格式rich: {a: {// 为“80”设置的样式fontSize: 16, // 放大字体大小fontWeight: 'bold', // 加粗color: '#000', // 字体颜色},b: {// 为“个/5800万”设置的样式fontSize: 14, // 字体大小color: '#929292',},},text: '项目总数 {a|80} {b|个/5800万}', // 显示的文本内容,使用上面定义的样式标签textAlign: 'center',fill: '#000', // 默认文本颜色,这里可能不会生效因为已经在rich中指定了颜色},},{type: 'text',left: '18%',top: '40%',style: {text: '72%',textAlign: 'center',fill: '#000',fontSize: 20,},},{type: 'text',left: '18%',top: '55%',z: 100,style: {text: '转化率',textAlign: 'center',fill: '#000',fontSize: 14,},},],};projectSigningOverviewElement.setOption(option);
};

4. 横向柱状排行榜

在这里插入图片描述
代码如下

const salesRanking = ref(null);// 绘制横向柱状图排行榜
const drawSalesRanking = () => {const salesRankingElement = echarts.init(salesRanking.value);const option = {tooltip: {trigger: 'axis',axisPointer: {type: 'shadow',},},grid: {left: '0%', // 调整左边距right: '5%', // 调整右边距bottom: '3%', // 调整底部边距top: '5%', // 调整顶部边距containLabel: true, // 确保标签和轴标题被包含在容器内},xAxis: {type: 'value',boundaryGap: [0, 0.01],axisLine: {show: false, // 不显示横坐标轴线},axisTick: {show: false, // 不显示刻度线},splitLine: {show: false, // 不显示x轴网格线},},yAxis: {type: 'category',data: ['刘晓彬', '萧秀凝', '曲严琰'], // 示例数据axisLine: {show: false, // 不显示横坐标轴线},axisTick: {show: false, // 不显示刻度线},splitLine: {show: false, // 不显示y轴网格线},axisLabel: {rich: {iconStyle: {fontSize: 20, // 设置图标的字体大小为20},nameStyle: {// 定义名字的样式fontSize: 12, // 设置名字的字体大小为12,或者您希望的任何大小},},formatter: function (value, index) {// 根据index或value来决定显示哪个排名的图标const rankIcons = {2: '{iconStyle|🥇}',1: '{iconStyle|🥈}',0: '{iconStyle|🥉}',};return `${rankIcons[index]} {nameStyle|${value}}`;},},},series: [{name: '销售额',type: 'bar',data: [920, 1032, 1201], // 示例数据barWidth: '30%', // 调整柱子宽度itemStyle: {borderRadius: [0, 5, 5, 0], // 只有右侧圆角color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [// 设置渐变色,方向也要调整为横向{ offset: 0, color: '#bdd1f6' },{ offset: 1, color: '#4282ff' },]),},label: {show: true, // 显示标签position: 'right', // 标签位置在顶部formatter: '{c}万', // 自定义显示的内容,{c}是指当前数据点的值},},],};salesRankingElement.setOption(option);
};

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

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

相关文章

计算机的错误计算(二十二)

摘要 计算机的错误计算&#xff08;十九&#xff09;展示了计算机的一个错误计算&#xff1a;本应该为 0的算式的结果不为0. 那么&#xff0c;增加计算精度&#xff0c;能确定是0吗&#xff1f;不一定。 计算机的错误计算&#xff08;十九&#xff09;展示了计算机对 的错误计…

适用于 Windows的 5 个最佳 PDF 转 Word 转换器

PDF 文件是共享文档的首选格式&#xff0c;但是&#xff0c;此类文件存在限制&#xff0c;使其难以修改或编辑。因此&#xff0c;您可能会发现自己正在寻找一种将 PDF 文件转换为 Word 或其他可编辑格式的方法。 有许多不同的 PDF 转换器&#xff0c;每个转换器的功能略有不同…

vue require引入静态文件报错

如果是通过向后端发送请求&#xff0c;动态的获取对应的文件数据流很容易做到文件的显示和加载。现在研究&#xff0c;一些不存放在后端而直接存放在vue前端项目中的静态媒体文件如何加载。 通常情况下&#xff0c;vue项目的图片jpg&#xff0c;png等都可以直接在/ass…

招聘一个1-3年经验的Java工程师:企业视角的技能与素质要求

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

Git错误分析

错误案例1&#xff1a; 原因&#xff1a;TortoiseGit多次安装导致&#xff0c;会记录首次安装路径&#xff0c;若安装路径改变&#xff0c;需要配置最后安装的路径。

Windows搭建本地对象存储服务MinIO并且使用springboot整合

开发文档&#xff1a; MinIO Windows中文文档 MinIO Object Storage for Windows &#xff08;英文文档&#xff09; 1、准备工作 准备一个空的文件夹&#xff0c;用来存放minio相关的内容&#xff1b; 这里是在D盘创建一个minio的文件夹&#xff1b; 后续所有跟MinIO相关…

matlab 超越椭圆函数图像绘制

matlab 超越椭圆函数图像绘制 超越椭圆函数图像绘制xy交叉项引入斜线负向斜线成分正向斜线成分 x^2 y^2 xy 1 &#xff08;负向&#xff09;绘制结果 x^2 y^2 - xy 1 &#xff08;正向&#xff09;绘制结果 超越椭圆函数图像绘制 xy交叉项引入斜线 相对于标准圆&#xf…

ESP32-Wifi问题解答

目录 前言 环境&#xff1a;arduino 芯片&#xff1a;ESP32 一、先上例程 1.大家打开官方例程 点击:示例->Wifi->WifiClient 2:Wifi配置 打开例程如图: 在1处设置WiFi名称 在2处设置WiFi密码 注意:双引号要留着 3:编译,烧录->问题发生了! 二、问题解决方法 1.…

NSK发布新版在线计算工具

July 01, 2024 NSK Ltd. Corporate Communications Department NSK Ltd. announced today that it has improved the engineering tools available on its website. The new engineering tools — NSK Online Catalog, Technical Calculations, and 2D/3D CAD Data — which …

ctfshow-web入门-文件包含(web87)巧用 php://filter 流绕过死亡函数的三种方法

目录 方法1&#xff1a;php://filter 流的 base64-decode 方法 方法2&#xff1a;通过 rot13 编码实现绕过 方法3&#xff1a;通过 strip_tags 函数去除 XML 标签 除了替换&#xff0c;新增 file_put_contents 函数&#xff0c;将会往 $file 里写入 <?php die(大佬别秀了…

E4.【C语言】练习:while和getchar的理解

#include <stdio.h> int main() {int ch 0;while ((ch getchar()) ! EOF){if (ch < 0 || ch>9)continue;putchar(ch);}return 0; } 理解上述代码 0-->48 9-->57 if行判断是否为数字&#xff0c;打印数字&#xff0c;不打印非数字

机器学习——随机森林

随机森林 1、集成学习方法 通过构造多个模型组合来解决单一的问题。它的原理是生成多个分类器/模型&#xff0c;各自独立的学习和做出预测。这些预测最后会结合成组合预测&#xff0c;因此优于任何一个单分类得到的预测。 2、什么是随机森林&#xff1f; 随机森林是一个包含…

[数据结构] 排序#插入排序希尔排序

标题&#xff1a;[数据结构] 排序#插入排序&希尔排序 水墨不写bug 目录 &#xff08;一&#xff09;插入排序 实现思路&#xff1a; 插入排序实现&#xff1a; &#xff08;二&#xff09;希尔排序 希尔排序的基本思想&#xff1a; 希尔排序的实现&#xff1a; 正…

IT入门知识第八部分《人工智能》(9/10)

1.引言 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;已成为推动技术革新的关键力量。它们不仅改变了我们与机器的互动方式&#xff0c;还极大地拓展了解决问题的可能性。本文将深入探讨人工智能和机器学习的基础&…

KDTree 简单原理与实现

介绍 K-D树是一种二叉树的数据结构&#xff0c;其中每个节点代表一个k维点&#xff0c;可用于组织K维空间中的点&#xff0c;其中K通常是一个非常大的数字。二叉树结构允许对多维空间中的点进行非常有效的搜索&#xff0c;包括最近邻搜索和范围搜索&#xff0c;树中的每个非叶…

Java毕业设计 基于SSM vue新生报到系统小程序 微信小程序

Java毕业设计 基于SSM vue新生报到系统小程序 微信小程序 SSM 新生报到系统小程序 功能介绍 学生 登录 注册 忘记密码 首页 学校公告 录取信息 录取详情 师资力量 教师详情 收藏 评论 用户信息修改 宿舍安排 签到信息 在线缴费 教室分配 我的收藏管理 我要发贴 我的发贴 管理…

【基于R语言群体遗传学】-7-遗传变异(genetic variation)

一些新名词 Continuous time: 连续时间&#xff0c;是指不间断流动的时间&#xff0c;不以单位时间形式出现。 Diffusion: 扩散&#xff0c;是指粒子从高浓度区域向低浓度区域的被动净移动。 Discrete time: 离散时间&#xff0c;是指被划分为单位的时间&#xff0c;例如每个…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-48全连接卷积神经网络(FCN)

48全连接卷积神经网络&#xff08;FCN&#xff09; 1.构造函数 import torch import torchvision from torch import nn from torch.nn import functional as F import matplotlib.pyplot as plt import liliPytorch as lp from d2l import torch as d2l# 构造模型 pretrained…

Python内存优化的实战技巧详解

概要 Python是一种高级编程语言,以其易读性和强大的功能而广受欢迎。然而,由于其动态类型和自动内存管理,Python在处理大量数据或高性能计算时,内存使用效率可能不如一些低级语言。本文将介绍几种Python内存优化的技巧,并提供相应的示例代码,帮助在开发中更高效地管理内…

Banana Pi BPI-M4 Berry创建热点和设置静态IP

create_ap是一个帮助快速创建Linux上的WIFI热点的脚本&#xff0c;并且支持bridge和NAT模式&#xff0c;能够自动结合hostapd, dnsmasq和iptables完成WIFI热点的设置&#xff0c;避免了用户进行复杂的配置&#xff0c;github地址如下&#xff1a; https://github.com/oblique/…