vue3使用echarts并封裝echarts組件方式
前言
本文使用的echarts版本為5.3.1,詳細(xì)文檔可見:
文中案例基于vue3編寫,有關(guān)js部分使用的是"script setup"語(yǔ)法糖形式
一、安裝并導(dǎo)入echart
1.npm下載包
npm i echarts --save
2.配置echarts
這里介紹使用 provide 和 injec 配置 echartst
provide、injec 可以實(shí)現(xiàn)嵌套組件之間進(jìn)行傳遞數(shù)據(jù)和方法
在父組件使用provide可向子代組件傳遞數(shù)據(jù);子級(jí)組件使用inject來獲取上級(jí)組件傳遞過來的數(shù)據(jù)
注:這兩個(gè)函數(shù)都是在setup函數(shù)中使用的
在 app.vue 下
<script>
import { provide } from 'vue'
import * as echarts from 'echarts'
export default {
setup() {
provide('echarts', echarts)
},
};
</script>
在子代組件,使用 inject 獲取 echarts 后便可使用
<script setup>
import { inject } from "vue"
const echarts = inject("echarts")
</script>
二、使用echarts
這里舉一個(gè)小例子:
<template>
<div class="echart" ref="chartDom"></div>
</template><script setup>
//按需導(dǎo)入需要用到的 vue函數(shù) 和echarts
import { ref, inject, onMounted } from "vue";
const echarts = inject("echarts");
//獲取 dom 和 父組件數(shù)據(jù) 并定義"myChart"用于初始化圖表
const chartDom = ref()
let myChart = null;
let option = reactive ({
title: { text: "總用戶量" },
tooltip: {},
xAxis: {
data: ["12-3", "12-4", "12-5", "12-6", "12-7", "12-8"],
},
yAxis: {},
series: [
{
name: "用戶量",
type: "line",
data: [5, 20, 36, 10, 10, 20],
},
],
})
//頁(yè)面成功渲染,開始繪制圖表
onMounted(() => {
myChart = echarts.init(chartDom.value)
myChart.setOption(props.option, true);
})
</script>
<style lang="scss" scoped>
.echart {
width: 800px;
height: 500px;
}
</style>
效果:

三、封裝echarts為組件
echarts封裝組件:
<template>
<div class="echart" ref="chartDom"></div>
</template>
<script setup>
//按需導(dǎo)入需要用到的 vue函數(shù) 和 echarts
import { ref, inject, onMounted, onBeforeUnmount, defineProps, watch } from "vue";
const echarts = inject("echarts");
//獲取 dom 和 父組件數(shù)據(jù) 并定義"myChart"用于初始化圖表
const chartDom = ref()
let myChart = null;
const props = defineProps({
option: Object,
})
//重繪圖表函數(shù)
const resizeHandler = () => {
myChart.resize();
}
//設(shè)置防抖,保證無(wú)論拖動(dòng)窗口大小,只執(zhí)行一次獲取瀏覽器寬高的方法
const debounce = (fun, delay) => {
let timer;
return function () {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(() => {
fun();
}, delay);
}
};
const cancalDebounce = debounce(resizeHandler, 500);
//頁(yè)面成功渲染,開始繪制圖表
onMounted(() => {
//配置為 svg 形式,預(yù)防頁(yè)面縮放而出現(xiàn)模糊問題;圖表過于復(fù)雜時(shí)建議使用 Canvas
myChart = echarts.init(chartDom.value,null, {renderer:'svg'})
// myChart = echarts.init(chartDom.value)
myChart.setOption(props.option, true);
//自適應(yīng)不同屏幕時(shí)改變圖表尺寸
window.addEventListener('resize', cancalDebounce);
})
//頁(yè)面銷毀前,銷毀事件和實(shí)例
onBeforeUnmount(() => {
window.removeEventListener('resize', cancalDebounce)
myChart.dispose()
})
//監(jiān)聽圖表數(shù)據(jù)時(shí)候變化,重新渲染圖表
watch(() => props.option, () => {
myChart.setOption(props.option, true);
}, { deep: true })
</script>
<style lang="scss" scoped>
.echart {
width: 100%;
height: 100%
}
</style>
上面的在不同屏幕大小下自適應(yīng)重繪圖表需在 flexible.js 的配置下才有效,有關(guān) flexible 的配置可參考 “移動(dòng)端與大屏幕自適應(yīng)適配方案”
注:在調(diào)用該組件時(shí)需傳入 option配置值 和 設(shè)置組件大小
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
element?el-tooltip實(shí)現(xiàn)自定義修改樣式
本文主要介紹了element?el-tooltip實(shí)現(xiàn)自定義修改樣式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
ubuntu中利用nginx部署vue項(xiàng)目的完整步驟
Nginx是一款輕量級(jí)的Web服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,在BSD-like 協(xié)議下發(fā)行,下面這篇文章主要給大家介紹了關(guān)于ubuntu中利用nginx部署vue項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2022-02-02
Vue2集成Lodop插件實(shí)現(xiàn)在線打印功能
這篇文章主要為大家詳細(xì)介紹了Vue2如何集成Lodop插件實(shí)現(xiàn)在線打印功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03
vue2 中如何實(shí)現(xiàn)動(dòng)態(tài)表單增刪改查實(shí)例
本篇文章主要介紹了vue2 中如何實(shí)現(xiàn)動(dòng)態(tài)表單增刪改查實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
Vue使用vux-ui自定義表單驗(yàn)證遇到的問題及解決方法
這篇文章主要介紹了Vue使用vux-ui自定義表單驗(yàn)證遇到的問題及解決方法,需要的朋友可以參考下2018-05-05
vue-class-setup?編寫?class?風(fēng)格組合式API
這篇文章主要為大家介紹了vue-class-setup?編寫?class?風(fēng)格組合式API,支持Vue2和Vue3,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09

