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

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

相关文章

EAI四个层次服务-系统架构师(二十六)

1、&#xff08;重点&#xff09;系统应用集成提供了4个不同层次服务&#xff0c;最上层服务是&#xff08;&#xff09;服务。 解析: EAI&#xff08;Enterprise Application Integration&#xff09;系统应用集成&#xff0c;相关概念。 实施EAI必须保证&#xff1a;应用程…

超详细版阿里云控制台环境配置+数据库配置

一、登录阿里云控制台 登录阿里云控制台&#xff0c;找到实例&#xff0c;切到阿里云服务器所在地址 &#x1f36d;不知道自己的服务器地址在哪边也没有关系&#xff0c;随便选择一个&#xff0c;查询不到记录的话会有以下提示&#xff0c;可以根据提示进行切换&#xff08;适…

贝叶斯估计(1):期末大乱炖

写在前面&#xff01; 1 先验分布和后验分布 三种信息&#xff1a;总体信息、样本信息、先验信息 总体信息&#xff1a;“总体是正态分布”&#xff1b;样本信息&#xff1a;总体抽取的样本提供的信息&#xff0c;是最新鲜的信息&#xff1b;先验信息&#xff1a;在抽样之前就…

罗剑锋的C++实战笔记学习(二):容器、算法库、多线程

4、容器 1&#xff09;、容器的通用特性 所有容器都具有的一个基本特性&#xff1a;它保存元素采用的是值&#xff08;value&#xff09;语义&#xff0c;也就是说&#xff0c;容器里存储的是元素的拷贝、副本&#xff0c;而不是引用 容器操作元素的很大一块成本就是值的拷贝…

DBA 数据库管理

数据库&#xff1a;存储数据的仓库 数据库服务软件&#xff1a; 关系型数据库&#xff1a; 存在硬盘 &#xff0c;制作表格的 数据库的参数 [rootmysql50 ~]# cat /etc/my.cnf.d/mysql-server.cnf 主配置文件 [mysqld] datadir/var/lib/mysql 存放数据库目录…

浅谈信息技术高效课堂管理:策略、技巧与实践

引言&#xff1a; 在信息化教育的浪潮中&#xff0c;信息技术课程正逐渐成为学校教育体系中的重要组成部分。然而&#xff0c;信息技术课堂的特殊性——高互动性、高度依赖电子设备&#xff0c;给课堂管理带来了前所未有的挑战。如何在保证教学效率的同时&#xff0c;维护良好…

多端多商户自定义DIY商城小程序源码系统 前后端分离 带完整的安装代码包以及搭建教程

系统概述 在当今数字化时代&#xff0c;电子商务的发展日新月异&#xff0c;为了满足不断变化的市场需求和用户期望&#xff0c;我们自豪地推出了一款具有前瞻性的创新产品——多端多商户自定义 DIY 商城小程序源码系统。这款系统不仅具备前后端分离的先进架构&#xff0c;还配…

git 禁止dev合并到任何其他分支

创建 pre-merge-commit 钩子 导航到 Git 仓库的钩子目录&#xff1a; cd /path/to/your/repo/.git/hooks创建或编辑 pre-merge-commit 钩子&#xff1a; 也可以通过指令创建 nano pre-merge-commit在钩子文件中添加以下代码&#xff1a; #!/bin/sh# 获取当前分支名称 curr…

使用tcpdump抓取本本机的所有icmp包

1、抓取本机所有icmp包 tcpdump -i any icmp -vv 图中上半部分&#xff0c;是源主机tmp179无法ping通目标主机192.168.10.79&#xff08;因为把该主机关机了&#xff09;的状态&#xff0c;注意看&#xff0c;其中有unreachable 图中下半部分&#xff0c;是源主机tmp179可以p…

RIP环境下的MGRE网络

首先将LSP的IP地址进行配置 其他端口也进行同样的配置 将serial3/0/1配置25.0.0.2 24 将serial4/0/0配置35.0.0.2 24 将GE0/0/0配置45.0.0.2 24 进行第二步 R1与R5之间使用ppp的pap认证 在R5中进行配置 在aaa空间中创建账号和密码 将这个账号和密码使用在ppp协议中 然后…

什么是静态住宅代理?一文看懂它

静态住宅代理&#xff08;也称为 ISP 代理&#xff09;是最流行的代理类型之一。它们也是隐藏身份和在线匿名的最佳方式之一。但是您需要了解它们什么&#xff1f;是什么让它们如此特别&#xff1f;为什么您要使用住宅代理而不是仅仅使用常规代理服务&#xff1f;如果你感兴趣&…

移动的话费充值卡有什么用?

现在大部分人充话费都是直接用微信啊、支付宝啥的充 话费卡绑定麻烦不说&#xff0c;一些不太熟悉操作的人&#xff0c;对话费卡的使用方法更是头疼 这不前两天我刚用积分兑了几张移动的话费卡&#xff0c;绑定过程真的太麻烦了 最后还是在收卡云上卖出去了&#xff0c;这样…

周鸿祎数字分身亮相世界人工智能大会,应对“刁难提问”对答如流

近日&#xff0c;2024世界人工智能大会&#xff08;WAIC&#xff09;在上海举办&#xff0c;三六零集团&#xff08;601360.SH&#xff0c;下称“360”&#xff09;携多款大模型创新应用亮相全球顶尖盛会&#xff0c;以技术引擎、场景应用、安全赋能和产业联盟四大主题&#xf…

将QComboBox下拉项中的文本居中、居右

目录 1. 需求提出 2. 解决方法 1. 需求提出 QComboBox下拉项中的文本默认是居左的&#xff0c;如下&#xff1a; 有时需要将下拉项中的文本居中、居右。如何实现&#xff1f; 2. 解决方法 首先想到的是通过样式表来解决&#xff0c;但找遍Qt Assist和网络&#xff0c;都没这…

【Python学习笔记】菜鸟教程Scrapy案例 + B站amazon案例视频

背景前摇&#xff08;省流可以跳过这部分&#xff09; 实习的时候厚脸皮请教了一位办公室负责做爬虫这块的老师&#xff0c;给我推荐了Scrapy框架。 我之前学过一些爬虫基础&#xff0c;但是用的是比较常见的BeautifulSoup和Request&#xff0c;于是得到Scrapy这个关键词后&am…

Linux环境部署Python Web服务

“姑娘&#xff0c;再见面就要靠运气了&#xff0c;可别装作不认识&#xff0c;那句“好久不见”可干万别打颤…” 将使用 Python 编写的后端 API 部署到 Linux 环境中&#xff0c;可以按照以下详细步骤操作。本文将涵盖环境准备、API 编写、使用 Gunicorn 作为 WSGI 服务器、配…

磁致伸缩液位计的应用领域

磁致伸缩液位计作为一种高精度、高稳定性的液位测量设备&#xff0c;在众多行业中都有着广泛的应用。接下来&#xff0c;我们将从多个角度详细探讨磁致伸缩液位计在不同领域的应用情况。 石油化工行业 在石油化工行业中&#xff0c;磁致伸缩液位计主要用于储罐、反应器和管道等…

celery执行任务报错ValueError: not enough values to unpack

背景 在做用户注册模块的时候需要对手机号验证的过程进行优化&#xff0c;目前想到的方式是通过celeryrabbitmq的方式进行异步处理&#xff0c;选择使用celery是因为使用方便、性能好、可分布式部署。 环境信息 目前使用地win11容器化启动 rabbitmq:3.13.2 python:3.6.8 cel…

Linux学习看这一篇就够了,超超超牛的Linux基础入门

引言 小伙伴们&#xff0c;不管是学习c还是学习其他语言在我们学的路上都绕不过操作系统&#xff0c;而且&#xff0c;老生常谈的Linux更是每个计算机人的必修&#xff0c;那么我们对Linux的了解可能只是从别人那听到的简单的这个系统很牛&#xff0c;巴拉巴拉的&#xff0c;但…

STM32介绍

本内容是基于江协科技STM32视频学习之后&#xff0c;并参考【重写】简析stm32启动过程-CSDN博客和STM32 最小系统_stm32最小系统-CSDN博客以及其他资料综合整理而成。 1. STM32 1.1 STM32简介 STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器&#xff1b;STM32常应用在…