Vue3 手把手按需引入 Echarts

这篇具有很好参考价值的文章主要介绍了Vue3 手把手按需引入 Echarts。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景:新项目采用 Vue3 作为前端项目框架,避免不了要使用 echarts,但是在使用的时候,出现了与 Vue2 使用不一样的地方,所以特别记下来,希望给到有需要的同学一些帮助。

下载Echarts依赖

# 自己使用的yarn
yarn add echarts

# or

npm install echarts --save

 # or
 
# 有淘宝镜像的可以选择  (安装速度快)
cnpm install echarts --save

创建按需引入的配置文件 echarts.ts(文件名称自定义)及进行配置

  1. 在你自己需要的目录下创建引入 eachrts 配置的文件,我是在 src/utils 目录下创建的 echarts.ts 文件(根据你自己的需求
  2. 在echarts.ts文件中引入echarts相关配置,网上有很多教程,但这里还是再啰嗦写一下,做戏做全套,一条龙服务。(看到最后有用给个点赞+收藏)
// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
import * as echarts from "echarts/core";

/** 引入柱状图 + 折线图 + 饼图,图表后缀都为 Chart,一般常用的就这三个,如果还需要其他的,就自行添加  */
import { BarChart, LineChart, PieChart } from "echarts/charts";

// 引入提示框,标题,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
import {
  TitleComponent,
  TooltipComponent,
  GridComponent,
  DatasetComponent,
  TransformComponent,
  ToolboxComponent,
  LegendComponent,
} from "echarts/components";

// 标签自动布局,全局过渡动画等特性
import { LabelLayout, UniversalTransition } from "echarts/features";

// 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
import { CanvasRenderer } from "echarts/renderers";

// 注册必须的组件
echarts.use([
  TitleComponent,
  TooltipComponent,
  GridComponent,
  DatasetComponent,
  TransformComponent,
  ToolboxComponent,
  LegendComponent,
  LabelLayout,
  UniversalTransition,
  CanvasRenderer,
  BarChart,
  LineChart,
  PieChart,
]);

// 导出
export default echarts;

根目录 main.ts 文件引入创建的配置文件 echarts.ts

项目另外采用了 Pinia + ElementPlus + ElementPlus(图标),引入方式都在下面,希望能够得到有需要的朋友帮助。

最重要的是要看本次引入echarts相关配置部分,注释也写好了,大家可以参考一下。

import { createApp } from "vue";
import { createPinia } from "pinia";

// 引入Element-plus
import ElementPlus from "element-plus";
import "element-plus/dist/index.css";
import zhCn from "element-plus/dist/locale/zh-cn.mjs";

// 引入图标
import * as ElementPlusIconsVue from "@element-plus/icons-vue";

// 引入路由
import router from "./routes/index";

// 引入echarts
import echarts from "./utils/echarts";

// 引入整个项目入口文件
import App from "./App.vue";

// 定义全局样式
import "./style.less";

// 创建 Store 实例
const piniaStore = createPinia();

// 创建Vue实例
const app = createApp(App);

// 注册 Element-plus图标
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
  app.component(key, component);
}

/***********************echart 挂载 START*******************************/

// echarts 挂载到 Vue实例中
// 注意:app.config.globalProperties 和 app.provide('$echarts', echarts) 二选一即可
// Vue.prototype.$echarts = echarts; // vue2的挂载方式

app.config.globalProperties.$echarts = echarts; // vue3的挂载方式(一个用于注册能够被应用内所有组件实例访问到的全局属性的对象。)

app.provide('$echarts', echarts); // vue3采用provide, inject方式使用

/***********************echart 挂载 END*******************************/

// 挂载element-plus,使用国际化,设置图标尺寸,及弹框层级
app.use(router).use(piniaStore).use(ElementPlus, {
  // size: 'small',
  zIndex: 3000,
  locale: zhCn,
});

// vue挂载到根节点
app.mount("#app");

组件内使用echarts

前面基本都还简单,但是到了使用的时候,很多人就不知道怎么处理了,以前在 Vue2 的时候还可以通过vue实例 拿到 this 去使用,但是到了 Vue3 里面,没有this 了,怎么办?

不着急,办法还是有的,并且还不止一种请接着往下看

  1. 通过 getCurrentInstance() 获取组件实例,类似 Vue2 中的 this
<script setup lang="ts">
	import { ref, getCurrentInstance } from 'vue';
	
	// 获取echart挂载的DOM节点
	const container = ref();
	
	// 获取当前组件实例
	const { proxy }: any = getCurrentInstance();
	
	// echarts初始化
	let myChart = proxy.$echarts.init(container.value);
	
	const option = {
		// 自定义echarts图标相关配置
	};
	
	myChart.setOption(option);
	
	// 根据页面大小自动响应图表大小
	window.addEventListener("resize", function () {
	    myChart.resize();
	});
	
</script>

<template>
	<div id="echarts1" ref="container"></div>
</template>
  1. 通过采用provide, inject方式使用
<script setup lang="ts">
	import { ref, inject} from 'vue';
	
	// 获取echart挂载的DOM节点
	const container = ref();

	// 通过 inject 接收Echarts
	const Echarts = inject('$echarts');

	// echarts初始化
	const myChart = (Echarts as any).init(container.value);

	const option = {
		// 自定义echarts图标相关配置
	};
	
	myChart.setOption(option);
	
	// 根据页面大小自动响应图表大小
	window.addEventListener("resize", function () {
	    myChart.resize();
	});
</script>

<template>
	<div id="echarts1" ref="container"></div>
</template>

上面的两种方式唯一不同的就是如何获取(接收)注册echarts。

到这里就结束了吗?

问题解决

太天真了!

这里我就要问下,上面两种方式的代码能够跑起来吗?

事实上,不行,因为上面 script 内的代码运行的时候,还没有挂载到组件实例上,找不到定义的 ref 对象 container,即使通过document.getElementById('echarts1') 的方式获取DOM节点 <div id="echarts1" ref="container"></div> 一样报 null 或者 undefined

子任就会出现如下报错:Uncaught (in promise) Error: Initialize failed: invalid dom.

Vue3 手把手按需引入 Echarts

不信? 那么就控制台打印输出看看两种方式获取的DOM到底是个啥。

<script setup lang="ts">
	import { ref } from 'vue';
	
	// 获取echart挂载的DOM节点
	const container = ref();
	console.log('获取的DOM-div:', document.getElementById('echarts1'), container.value);
	
</script>

<template>
	<div id="echarts1" ref="container"></div>
</template>

上面的代码输出一下结果:

Vue3 手把手按需引入 Echarts

那么解决办法也很简单,直接开启一个延时器 setTimeout 就好了。

最后完整代码如下:

<script setup lang="ts">
	import { ref, inject, onBeforeUnmount} from 'vue';
	
	// 获取echart挂载的DOM节点
	const container = ref();
	
	// 定义延时器指针对象,便于组件实例销毁的时候以便清除
	const timer = ref();

	// 通过 inject 接收Echarts
	const Echarts = inject('$echarts');
	
	// 或
	// 通过Vue全局注册方式获取
	// const {proxy}: any = getCurrentInstance();
	

	const initEchartsOneFn = () => {
		// echarts初始化
		const myChart = (Echarts as any).init(container.value);

		// 或
		// let myChart = proxy.$echarts.init(container.value);
	
		const option = {
			// 自定义echarts图标相关配置
		};
		
		myChart.setOption(option);
		
		// 根据页面大小自动响应图表大小
		window.addEventListener("resize", function () {
		    myChart.resize();
		});
	}

	// 判断定时器是否存在
	if (timer.value) {
	    clearTimeout(timer.value);
	}
	
	// 绑定定时器,销毁的时候再次清除
	timer.value = setTimeout(() => initEchartsOneFn(), 1000);
	
	// 组件实例销毁前清除延时器对象
	onBeforeUnmount(() => {
	    if (timer.value) clearTimeout(timer.value);
	});
</script>

// 此处部分将就着看看
<template>
	<div id="echarts1" ref="container"></div>
</template>

以证清白,上效果图:

Vue3 手把手按需引入 Echarts

最后

如果这篇文章对你有所帮助,请咚咚大家的 发财黄金手指点赞收藏

如果文章有描述错误或者有更好解决方案,也请大家多多 评论文章来源地址https://www.toymoban.com/news/detail-431036.html

到了这里,关于Vue3 手把手按需引入 Echarts的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手把手教你用 Docker 部署 Vue3 项目

    用 docker 可以帮我们快速部署前端项目,本文介绍了如何用 docker 快速部署 vue3 项目。请准备好一台云服务器并安装好 docker,然后开始阅读本教程。 执行 npm run build 打包后项目目录中会多出一个 dist 文件夹 利用 docker 拉取 nginx 镜像 在服务器中创建工作目录,这里我放在 /ho

    2024年02月05日
    浏览(36)
  • Mars3D手把手开发教程(vue3)

    Mars3D三维可视化平台  是火星科技 (opens new window)研发的一款基于 WebGL 技术实现的三维客户端开发平台,基于Cesium (opens new window)优化提升与B/S架构设计,支持多行业扩展的轻量级高效能GIS开发平台,能够免安装、无插件地在浏览器中高效运行,并可快速接入与使用多种GIS数

    2024年04月15日
    浏览(63)
  • 手把手完成前端Vue3 + Vite项目工程化搭建

    基于 Vue3 + Vite 搭建的前端工程化项目演示模板 开发环境: Node.js v16.14.2 + npm v8.3.2 开发工具: Visual Studio Code or WebStorm 源代码管理: Git npm镜像: npm config set registry https://registry.npmmirror.com 技术栈 描述 Vue 渐进式 JavaScript 框架 Vite 新一代前端开发与构建工具 Element Plus 基于 Vue

    2024年04月11日
    浏览(43)
  • vue系列(三)——手把手教你搭建一个vue3管理后台基础模板

    目录 一、前言: 二、网站页面分析 三、开发步骤 (一)、安装element (二)、安装使用svg插件 (三)、编写主界面框架代码  (四)、编写菜单栏  (五)、新建页面及路由 (六)、定制页面标签栏 第一步: 第二步: (七)、修改封装菜单栏 (八)、添加面包屑 四、结

    2023年04月24日
    浏览(43)
  • 揭秘报表新玩法!标配插件不再单调,手把手教你如何在浏览器中引入柱形图插件。

    摘要:本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 图表作为一款用于可视化数据的工具,可以帮助我们更好的分析和理解数据,并发现数据之间的关系和趋势。下面以柱形图

    2024年02月08日
    浏览(29)
  • vue项目打包部署-手把手教程

    1.购买服务器 可选阿里云/腾讯云/华为云 等等… 购买时选择镜像,我们这里以CentOS为例 2.配置服务器 2.1 安装FinalShell ​ 需要本地使用一些软件来操作服务器,例如:FinalShell / Xshell … ​ 我这里使用的是FinalShell,安装好以后,打开软件与建立链接,就可以用命令行来操作服务器了 最

    2024年02月22日
    浏览(42)
  • [手把手系列之]Docker 部署 vue 项目

    Docker 作为轻量级虚拟化技术,拥有持续集成、版本控制、可移植性、隔离性和安全性等优势。本文使用Docker来部署一个vue的前端应用,并尽可能详尽的介绍了实现思路和具体步骤,以方便有类似需要的同学参考。 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应

    2024年03月24日
    浏览(51)
  • Docker容器部署前端Vue服务——手把手教学

    需要工具: Xftp Xshell   首先对前端项目进行打包:npm run build   打包完成 ​ 在项目中生成dist文件: 通过Xshell在/home目录下创建项目文件夹 通过Xftp将打包的dist文件上传到服务器的项目文件夹下; 利用Xshell在拉取nginx镜像 在项目文件夹下编写nginx config配置文件 default.conf内容

    2024年02月07日
    浏览(43)
  • vue3中按需引入element-ui并配置

    element-ui官网地址:element-ui官网-vue3 npm安装 如果对打包后的文件大小不是很在乎,那么使用完整导入会更方便,这里推荐使用按需引入。 按需引入具体步骤: 首先需要安装unplugin-vue-components 和 unplugin-auto-import这两款插件。 配置vue.config.js文件 main.js文件配置 如果需要使用el

    2024年02月12日
    浏览(34)
  • vue3 vite直接创建项目 添加 element-ui 按需引入和全部引入

     创建home 工程 yran dev就可以看到一个网址 点进去就可以看到效果了 添加element-ui 之前的main.js 修改后的 element-plus 在vue3中的按需引入。要比2简介很多 。自动导入也是推荐的一种写法 我们注释掉全局引用  然后改为按需引入 源文件  修改后 首先安装两款插件 修改后

    2024年02月17日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包