最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

手把手教你Vue3?按需引入?Echarts的過程(收藏)

 更新時間:2023年10月14日 10:06:01   作者:趙花花5070  
新項目采用?Vue3?作為前端項目框架,避免不了要使用?echarts,但是在使用的時候,出現了與?Vue2?使用不一樣的地方,所以特別記下來,希望給到有需要的同學一些幫助

背景:新項目采用 Vue3 作為前端項目框架,避免不了要使用 echarts,但是在使用的時候,出現了與 Vue2 使用不一樣的地方,所以特別記下來,希望給到有需要的同學一些幫助。

下載Echarts依賴

# 自己使用的yarn
yarn add echarts
# or
npm install echarts --save
 # or
# 有淘寶鏡像的可以選擇  (安裝速度快)
cnpm install echarts --save

創(chuàng)建按需引入的配置文件 echarts.ts(文件名稱自定義)及進行配置

在你自己需要的目錄下創(chuàng)建引入 eachrts 配置的文件,我是在 src/utils 目錄下創(chuàng)建的 echarts.ts 文件(根據你自己的需求)在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 文件引入創(chuàng)建的配置文件 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";

// 創(chuàng)建 Store 實例
const piniaStore = createPinia();

// 創(chuàng)建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掛載到根節(jié)點
app.mount("#app");


組件內使用echarts

前面基本都還簡單,但是到了使用的時候,很多人就不知道怎么處理了,以前在 Vue2 的時候還可以通過vue實例 拿到 this 去使用,但是到了 Vue3 里面,沒有this 了,怎么辦?

不著急,辦法還是有的,并且還不止一種,請接著往下看。

1.通過 getCurrentInstance() 獲取組件實例,類似 Vue2 中的 this

<script setup lang="ts">
	import { ref, getCurrentInstance } from 'vue';
	
	// 獲取echart掛載的DOM節(jié)點
	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>

2.通過采用provide, inject方式使用

<script setup lang="ts">
	import { ref, inject} from 'vue';
	
	// 獲取echart掛載的DOM節(jié)點
	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>

上面的兩種方式唯一不同的就是如何獲?。ń邮眨┳詄charts。

到這里就結束了嗎?

問題解決

太天真了!

這里我就要問下,上面兩種方式的代碼能夠跑起來嗎?

事實上,不行,因為上面 script 內的代碼運行的時候,還沒有掛載到組件實例上,找不到定義的 ref 對象 container,即使通過document.getElementById('echarts1') 的方式獲取DOM節(jié)點 <div id="echarts1" ref="container"></div> 一樣報 null 或者 undefined。

子任就會出現如下報錯:Uncaught (in promise) Error: Initialize failed: invalid dom.

不信? 那么就控制臺打印輸出看看兩種方式獲取的DOM到底是個啥。

<script setup lang="ts">
	import { ref } from 'vue';
	
	// 獲取echart掛載的DOM節(jié)點
	const container = ref();
	console.log('獲取的DOM-div:', document.getElementById('echarts1'), container.value);
	
</script>

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

上面的代碼輸出一下結果:

那么解決辦法也很簡單,直接開啟一個延時器 setTimeout 就好了。

最后完整代碼如下:

<script setup lang="ts">
	import { ref, inject, onBeforeUnmount} from 'vue';
	
	// 獲取echart掛載的DOM節(jié)點
	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的文章就介紹到這了,更多相關Vue按需引入 Echarts內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解使用Vue.Js結合Jquery Ajax加載數據的兩種方式

    詳解使用Vue.Js結合Jquery Ajax加載數據的兩種方式

    本篇文章主要介紹了詳解使用Vue.Js結合Jquery Ajax加載數據的兩種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Vue實現Layui的集成方法步驟

    Vue實現Layui的集成方法步驟

    這篇文章主要介紹了Vue實現Layui的集成方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • 詳解Vue 2中的? initState 狀態(tài)初始化

    詳解Vue 2中的? initState 狀態(tài)初始化

    這篇文章主要介紹了詳解Vue 2中的initState狀態(tài)初始化,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 如何為Vue3提供一個可媲美Angular的ioc容器

    如何為Vue3提供一個可媲美Angular的ioc容器

    ue3因其出色的響應式系統,以及便利的功能特性,完全勝任大型業(yè)務系統的開發(fā),這篇文章主要介紹了如何為Vue3提供一個可媲美Angular的ioc容器,需要的朋友可以參考下
    2024-08-08
  • vue實現圖片加載完成前的loading組件方法

    vue實現圖片加載完成前的loading組件方法

    下面小編就為大家分享一篇vue實現圖片加載完成前的loading組件,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • vue?批量自動引入并注冊組件或路由實現詳解

    vue?批量自動引入并注冊組件或路由實現詳解

    這篇文章主要為大家介紹了vue?批量自動引入并注冊組件或路由實現詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • vue表單中遍歷表單操作按鈕的顯示隱藏示例

    vue表單中遍歷表單操作按鈕的顯示隱藏示例

    今天小編就為大家分享一篇vue表單中遍歷表單操作按鈕的顯示隱藏示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • 詳解VueJS應用中管理用戶權限

    詳解VueJS應用中管理用戶權限

    本篇文章主要給大家講述了VueJS應用中管理用戶權限的詳細過程和方法,以及相關的代碼展示,需要的朋友參考下吧。
    2018-02-02
  • 解決node-sass安裝報錯無python等情況

    解決node-sass安裝報錯無python等情況

    在國內安裝node-sass常因無法穩(wěn)定連接GitHub而失敗,解決方法包括手動下載對應的binding.node文件并放入緩存目錄,操作步驟詳細,適合非Python用戶,無需額外環(huán)境配置
    2024-10-10
  • Vue3實現markdown-it支持chartjs、Echartjs、mermaid的渲染(附實例代碼)

    Vue3實現markdown-it支持chartjs、Echartjs、mermaid的渲染(附實例代碼)

    markdown-it-vue使用markdown-it作為Markdown數據解析引擎,整合多種markdown-it插件,并內置了一些自己的功能性插件,這篇文章主要介紹了Vue3實現markdown-it支持chartjs、Echartjs、mermaid渲染的相關資料,需要的朋友可以參考下
    2025-08-08

最新評論

柞水县| 张家界市| 上饶市| 昆山市| 大丰市| 伊春市| 和林格尔县| 阿坝| 包头市| 宣威市| 涡阳县| 遵义市| 将乐县| 三亚市| 定日县| 北辰区| 蛟河市| 阜南县| 仲巴县| 安多县| 华亭县| 建湖县| 浦江县| 新邵县| 古蔺县| 仙桃市| 石渠县| 龙州县| 池州市| 波密县| 青岛市| 嘉义县| 扎兰屯市| 新建县| 沙田区| 正镶白旗| 达尔| 来安县| 林州市| 兴山县| 如东县|