關(guān)于vue 結(jié)合原生js 解決echarts resize問(wèn)題
解決頁(yè)面echarts 圖表 resize問(wèn)題

左側(cè)的菜單欄模塊是可以收縮的,點(diǎn)擊左上角的 icon 可以收縮,但是點(diǎn)擊左上角的icon后,右側(cè)的echarts圖并未進(jìn)行對(duì)應(yīng)的收縮,使用 element-resize-detector 插件能夠解決問(wèn)題(如何解決Vue項(xiàng)目中使用echarts,寬度變化導(dǎo)致圖不能resize問(wèn)題)但是會(huì)有點(diǎn)卡頓,所以采用原生的方法來(lái)處理,再結(jié)合windows 自帶的原生 resize 事件處理 瀏覽器寬度高度變化,可以不使用插件來(lái)處理問(wèn)題了。
<template>
<div
id="leftEchartPie"
ref="leftEchartPie"
></div>
</template>
<script>
export default {
props: {
leftPieData: {
type: Object,
default: {}
}
},
data() {
return {
myChart: null,
option: null,
observe: null,
optionData: []
};
},
watch: {
leftPieData: {
deep: true,
handler(leftPieData) {
if (leftPieData) {
this.initChart(leftPieData);
}
}
}
},
mounted() {
const option = {
title: {
zlevel: 0,
text: null,
rich: {
value: {
color: "#3F495A",
fontSize: 14,
lineHeight: 16
},
name: {
color: "#3F495A",
fontSize: 14,
lineHeight: 16
}
},
top: "center",
left: "19.3%",
textAlign: "center",
textStyle: {
rich: {
value: {
color: "#3F495A",
fontSize: 14,
lineHeight: 16
},
name: {
fontSize: 16,
color: "#3F495A",
lineHeight: 30
}
}
}
},
tooltip: {
show: true,
trigger: "item",
formatter: "{a} <br/>: {c} (vvxyksv9kd%)"
},
legend: {},
series: [
{
name: "Security Status",
type: "pie",
center: ["20%", "50%"],
radius: ["80%", "45%"],
itemStyle: {
borderWidth: 6,
borderColor: "#fff"
},
hoverAnimation: false,
avoidLabelOverlap: false,
label: {
show: false,
position: "center"
},
emphasis: {
label: {
show: false,
fontSize: "30",
fontWeight: "bold"
}
},
labelLine: {
show: false
},
data: []
}
]
};
this.option = option;
var dom = document.getElementById("leftEchartPie");
var myChart = this.echarts.init(dom);
this.myChart = myChart;
// 使用瀏覽器原生的MutationObserver來(lái)處理
const observer = new MutationObserver(() => {
setTimeout(this.myChart.resize, 201);
});
const config = { attributes: true, childList: true, subtree: false };
this.observe = observer;
observer.observe(document.getElementsByClassName("spoc-menu")[0], config);
// 處理瀏覽器窗口大小變化觸發(fā)resize
window.addEventListener("resize", this.resizeEchart, true);
},
beforeDestroy() {
this.observe.dis;
window.removeEventListener("resize", this.resizeEchart, true);
},
methods: {
resizeEchart() {
this.myChart.resize();
},
initChart(leftPieData) {
this.option.text = [
"{name|Total}",
"{value|" + leftPieData.totalNum + "}"
].join("\n");
this.option.legend.data = [
`Very High Risk`,
`High Risk`,
`Medium Risk`,
`Low Risk`,
`Very Low Risk`
];
this.option.series[0].data = [
{
value: this.leftPieData.veryHighRiskNum,
name: `Very High Risk`,
itemStyle: {
color: "#FF4D4F"
}
},
{
value: this.leftPieData.highRiskNum,
name: `High Risk`,
itemStyle: {
color: "#FA9314"
}
},
{
value: this.leftPieData.mediumRiskNum,
name: `Medium Risk`,
itemStyle: {
color: "#FACB14"
}
},
{
value: this.leftPieData.lowRiskNum,
name: `Low Risk`,
itemStyle: {
color: "#4ED6CC"
}
},
{
value: this.leftPieData.veryLowNum,
name: `Very Low Risk`,
itemStyle: {
color: "#2BD374"
}
}
];
this.optionData = this.option.series[0].data;
const optionData = this.optionData;
this.option.legend = {
textStyle: {
fontSize: 14,
color: "#3F495A"
},
orient: "vertical",
left: "60%",
itemGap: 30, // 字高
top: "middle",
icon: "circle",
itemHeight: 10, //改變圓圈大小
// data: [],
formatter(params) {
if (optionData.length) {
switch (params) {
case "Very High Risk":
return params + " " + optionData[0].value;
break;
case "High Risk":
return params + " " + optionData[1].value;
break;
case "Medium Risk":
return params + " " + optionData[2].value;
break;
case "Low Risk":
return params + " " + optionData[3].value;
break;
case "Very Low Risk":
return params + " " + optionData[4].value;
break;
default:
return "";
}
}
}
};
// 繪制圖表
this.myChart.setOption(this.option);
}
}
};
</script>
<style>
#leftEchartPie {
width: 100%;
height: calc(100% - 60px);
}
</style>
核心代碼
// 使用瀏覽器原生的MutationObserver來(lái)處理
const observer = new MutationObserver(() => {
setTimeout(this.myChart.resize, 201);
});
const config = { attributes: true, childList: true, subtree: false };
this.observe = observer;
observer.observe(document.getElementsByClassName("spoc-menu")[0], config);
// 處理瀏覽器窗口大小變化觸發(fā)resize
window.addEventListener("resize", this.resizeEchart, true);
關(guān)于MutationObserver的使用 參考
最后注意需要beforeDestroy 里面銷毀掉 監(jiān)聽的時(shí)間和 MutationObserver 監(jiān)聽的事件,避免事件一直在頁(yè)面里面,消耗內(nèi)存。
最后開發(fā)完后,對(duì)比了下和之前使用的插件,原生js處理的體驗(yàn)比插件反應(yīng)快,插件給人的感覺(jué)盾一點(diǎn)
ok 這就是關(guān)于 vue 結(jié)合原生js 解決echarts resize問(wèn)題 的開發(fā)心得啦 ~希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue+elementUi 實(shí)現(xiàn)密碼顯示/隱藏+小圖標(biāo)變化功能
這篇文章主要介紹了vue+elementUi 實(shí)現(xiàn)密碼顯示/隱藏+小圖標(biāo)變化功能,需本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
詳細(xì)聊聊vue組件是如何實(shí)現(xiàn)組件通訊的
組件間通信簡(jiǎn)單來(lái)說(shuō)就是組件間進(jìn)行數(shù)據(jù)傳遞,就像我們?nèi)粘5拇螂娫?就是通訊的一種方式,下面這篇文章主要給大家介紹了關(guān)于vue組件是如何實(shí)現(xiàn)組件通訊的相關(guān)資料,需要的朋友可以參考下2022-05-05
Ant Design的可編輯Tree的實(shí)現(xiàn)操作
這篇文章主要介紹了Ant Design的可編輯Tree的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
vscode中prettier和eslint換行縮進(jìn)沖突的問(wèn)題
這篇文章主要介紹了vscode中prettier和eslint換行縮進(jìn)沖突的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
HTML頁(yè)面中使用Vue示例進(jìn)階(快速學(xué)會(huì)上手Vue)
Vue是用于構(gòu)建用戶界面的漸進(jìn)式JavaScript框架。特色:構(gòu)建用戶界面—數(shù)據(jù)變成界面;漸進(jìn)式—Vue可以自底向上逐層的應(yīng)用。VUE有兩種使用方式,一種實(shí)在html中直接使用vue做開發(fā),一種是企業(yè)級(jí)的單頁(yè)面應(yīng)用。2023-02-02
ElementUI實(shí)現(xiàn)el-table行列合并的操作步驟
在前端開發(fā)中,數(shù)據(jù)展示一直是一個(gè)重要的部分,而表格則是數(shù)據(jù)展示最常見的形式之一,ElementUI 是餓了么前端團(tuán)隊(duì)推出的一款基于 Vue 的 UI 組件庫(kù),其中的 el-table 組件是一個(gè)功能強(qiáng)大且靈活的表格組件,今天我們要詳細(xì)探討的是 el-table 的行列合并操作2024-08-08
Vue3中進(jìn)行二維碼的生成與解碼實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Vue3中進(jìn)行二維碼的生成與解碼實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

