vue3封裝ECharts組件詳解
一、前言
前端開發(fā)需要經(jīng)常使用ECharts圖表渲染數(shù)據(jù)信息,在一個項目中我們經(jīng)常需要使用多個圖表,選擇封裝ECharts組件復用的方式可以減少代碼量,增加開發(fā)效率。
二、封裝ECharts組件
為什么要封裝組件
- 避免重復的工作量,提升復用性
- 使代碼邏輯更加清晰,方便項目的后期維護
- 封裝組件可以讓使用者不去關(guān)心組件的內(nèi)部實現(xiàn)以及原理,能夠使一個團隊更好的有層次的去運行
封裝的ECharts組件實現(xiàn)了以下的功能:
- 使用組件傳遞ECharts中的
option屬性 - 手動/自動設(shè)置chart尺寸
- chart自適應寬高
- 動態(tài)展示獲取到的后端數(shù)據(jù)
本文使用的是vue3 + typescript的寫法。
代碼實現(xiàn):
ECharts組件:
<template>
<div :id="id" :class="className" :style="{ height, width }" />
</template>
<script setup lang="ts">
//按需導入需要用到的 vue函數(shù) 和 echarts
import { onMounted, onBeforeUnmount, defineProps, watch } from "vue";
import * as echarts from 'echarts';
//獲取 dom 和 父組件數(shù)據(jù) 并定義"myChart"用于初始化圖表
let myChart: echarts.ECharts;
const props = defineProps({
id: {
type: String,
default: 'chart',
required: true
},
className: {
type: String,
default: ''
},
width: {
type: String,
default: '100%',
},
height: {
type: String,
default: '300px',
},
loading: {
type: Boolean,
default: true,
},
fullOptions: {
type: Object,
default: () => ({}),
required: true
},
})
//重繪圖表函數(shù)
const resizeHandler = () => {
myChart.resize();
}
//設(shè)置防抖,保證無論拖動窗口大小,只執(zhí)行一次獲取瀏覽器寬高的方法
const debounce = (fun: { (): void; (): void; }, delay: number | undefined) => {
let timer: number | undefined;
return function () {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(() => {
fun();
}, delay);
}
};
const cancalDebounce = debounce(resizeHandler, 50);
//頁面成功渲染,開始繪制圖表
onMounted(() => {
//配置為 svg 形式,預防頁面縮放而出現(xiàn)模糊問題;圖表過于復雜時建議使用 Canvas
myChart = echarts.init(document.getElementById(props.id) as HTMLDivElement, { renderer: 'svg' })
myChart.showLoading({
text: '',
color: '#409eff',
textColor: '#000',
maskColor: 'rgba(255, 255, 255, .95)',
zlevel: 0,
lineWidth: 2,
});
if (!props.loading) {
myChart.hideLoading();
myChart.setOption(props.fullOptions.options, true);
}
//自適應不同屏幕時改變圖表尺寸
window.addEventListener('resize', cancalDebounce);
})
//頁面銷毀前,銷毀事件和實例
onBeforeUnmount(() => {
window.removeEventListener('resize', cancalDebounce)
myChart.dispose()
})
//監(jiān)聽圖表數(shù)據(jù)時候變化,重新渲染圖表
watch(() => [props.fullOptions.options, props.loading], () => {
if (!props.loading) {
myChart.hideLoading();
myChart.setOption(props.fullOptions.options, true);
}
}, { deep: true })
</script>ECharts組件的用法:
<template>
<Echarts
id="echarts"
height="300px"
:full-options="echartsOptions"
:loading="loading"
>
</Echarts>
</template>
<script setup lang="ts">
// 引進Echarts 組件
import Echarts from '@/components/Echarts/Echarts.vue';
// 引進Echarts 的options配置文件,可根據(jù)項目模塊來創(chuàng)建該配置文件
import chartOption from '@/components/Echarts/options';
const echartsOptions = reactive({
options: { },
init: false
});
// 此處可請求接口來獲取數(shù)據(jù)
// 我的options配置使用的是dataset的形式,傳進options中的兩個參數(shù)data(圖表的數(shù)據(jù))和dimension(圖表的維度),
onMounted(() => {
const testData = [26,27,24,23];
const testDimensions = ['家用電器','戶外運動','汽車用品','手機數(shù)碼'];
echartsOptions.options = chartOption.testOption(testData, testDimensions);
});
</script>效果:

到此這篇關(guān)于vue3封裝ECharts組件詳解的文章就介紹到這了,更多相關(guān)vue3封裝ECharts內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue框架和react框架的區(qū)別以及各自的應用場景使用
這篇文章主要介紹了vue框架和react框架的區(qū)別以及各自的應用場景使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
vue quill editor 使用富文本添加上傳音頻功能
vue-quill-editor 是vue項目中常用的富文本插件,其功能能滿足大部分的項目需求。這篇文章主要介紹了vue-quill-editor 富文本添加上傳音頻功能,需要的朋友可以參考下2020-01-01
VUE 直接通過JS 修改html對象的值導致沒有更新到數(shù)據(jù)中解決方法分析
這篇文章主要介紹了VUE 直接通過JS 修改html對象的值導致沒有更新到數(shù)據(jù)中解決方法,結(jié)合實例形式詳細分析了VUE使用JS修改html對象的值導致沒有更新到數(shù)據(jù)的原因與解決方法,需要的朋友可以參考下2019-12-12
Vue設(shè)置select下拉框的默認選項詳解(select空白bug解決)
最近開始學習vue,在學習的過程中遇到的問題將記錄在這里,下面這篇文章主要給大家介紹了關(guān)于Vue設(shè)置select下拉框的默認選項(select空白bug解決)的相關(guān)資料,需要的朋友可以參考下2022-12-12
vue實現(xiàn)拖拽的簡單案例 不超出可視區(qū)域
這篇文章主要為大家詳細介紹了vue實現(xiàn)拖拽的簡單案例,不超出可視區(qū)域,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07
vue去掉嚴格開發(fā),去掉vue-cli安裝時的eslint或修改配置方式
這篇文章主要介紹了vue去掉嚴格開發(fā),去掉vue-cli安裝時的eslint或修改配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04

