Vue中封装eCharts组件及优化方式
作者:Lim_J
这篇文章主要介绍了Vue中封装eCharts组件及优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
Vue封装eCharts组件及优化
Vue中想要使用eCharts作为一个单独的组件进行封装,一般需要考虑的是option的封装、视口变化或数据变化更新eCharts视图,以及在组件销毁之前注销eCharts组件以释放其占用的内存。
option的封装思路
一般情况下,一个业务模块内eCharts的风格只有固定的几种内容,因此仅需要对固定的几种模式进行封装即可,我这里采用生成option的方式节约代码量
generateOptionFrom(originalChartData, options = {}) {
// do something with originalData
let series = doSomething(originalChartData);
return {
name: '',
legend: [],
tooltip: {},
// ...
series,
...options
};
}
eCharts组件封装要点
eCharts组件和直接在js中更新eCharts有些许不同,js调用时,数据更新需要调用API中的setOption,Vue组件中想要更新组件,由于数据并不是挂载到DOM属性上的,因此需要用watch监听数据更新
<template>
<div class="charts" ref="eCharts">
</div>
</template>
<script>
import * as echart from 'echarts';
export default {
props: {
options: {
type: Object
},
height: {
type: String,
default: '300px'
}
},
mounted() {
// eCharts在初始化的时候有时捕捉不到元素高度,这里手动设置一下
this.$refs.eCharts.style.height = this.height;
this.$nextTick(() => {
this.initChart(this.options);
});
},
beforeDestroy() {
// 组件销毁时主动释放eCharts内存空间
const chartsInstance = echart.getInstanceByDom(this.$refs.eCharts);
chartsInstance && chartsInstance.dispose();
window.onresize = null;
},
watch: {
options() {
const chartsInstance = echart.getInstanceByDom(this.$refs.eCharts);
chartsInstance && chartsInstance.setOption(this.options);
}
},
methods: {
initChart() {
if (!this.$refs.eCharts) {
// 确保执行初始化时Container存在
return;
}
const chartInstace = echart.init(this.$refs.eCharts);
chartInstace.setOption(this.options);
// 视口大小变化时调用resize调整eCharts大小,如果Container尺寸并非自适应则无需设置
window.onresize = function () {
chartInstace.resize();
};
// ...add other operations or events
}
}
}
</script>
这里使用ref去找Container元素是利用Vue的优势,比起使用选取dom的方式方便很多
Vue封装echarts组件多次调用出现id重复
问题描述
封装的echarts组件多次被调用,id重复,导致页面不渲染、数据覆盖等一系列问题
解决方法
1、把id改成动态传参(这里就不作代码展示了)
2、把id换成ref
//修改前
<div id="vcharts" style="width: 100%; height: 500px"></div>
//修改后
<div ref="vcharts" style="width: 100%; height: 500px"></div>
//修改前
let myChart = this.$echarts.init(document.getElementById("vcharts"));
//修改后
let myChart = this.$echarts.init(this.$refs.vcharts);总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
