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

左側(cè)的菜單欄模塊是可以收縮的,點(diǎn)擊左上角的 icon 可以收縮,但是點(diǎn)擊左上角的icon后,右側(cè)的echarts圖并未進(jìn)行對(duì)應(yīng)的收縮,使用 element-resize-detector 插件能夠解決問題(如何解決Vue項(xiàng)目中使用echarts,寬度變化導(dǎo)致圖不能resize問題)但是會(huì)有點(diǎn)卡頓,所以采用原生的方法來處理,再結(jié)合windows 自帶的原生 resize 事件處理 瀏覽器寬度高度變化,可以不使用插件來處理問題了。
<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} (agq6mau%)"
},
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來處理
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來處理
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)快,插件給人的感覺盾一點(diǎn)
ok 這就是關(guān)于 vue 結(jié)合原生js 解決echarts resize問題 的開發(fā)心得啦 ~希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue項(xiàng)目頁(yè)面的打印和下載PDF加loading效果的實(shí)現(xiàn)(加水印)
這篇文章主要介紹了vue項(xiàng)目頁(yè)面的打印和下載PDF加loading效果的實(shí)現(xiàn)(加水印),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Vue.js中Line第三方登錄api的實(shí)現(xiàn)代碼
這篇文章主要介紹了Vue.js中Line第三方登錄api實(shí)現(xiàn)代碼,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
Vue+Echarts實(shí)現(xiàn)基本K線圖的繪制
這篇文章主要為大家詳細(xì)介紹了如何利用Vue和Echarts實(shí)現(xiàn)基本K線圖的繪制,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03
Vue組件重新渲染(組件重載)的3種實(shí)現(xiàn)方式
這篇文章主要介紹了Vue組件重新渲染(組件重載)的3種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Vue3格式化Volar報(bào)錯(cuò)的原因分析與解決
Volar 與vetur相同,volar是一個(gè)針對(duì)vue的vscode插件,下面這篇文章主要給大家介紹了關(guān)于Vue3格式化Volar報(bào)錯(cuò)的原因分析與解決方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
vuecli+AXdownload下載組件封裝?+css3下載懸浮球動(dòng)畫效果
當(dāng)觸發(fā)下載功能的時(shí)候,會(huì)觸發(fā)一個(gè)下載動(dòng)畫,下載懸浮球會(huì)自動(dòng)彈出,并且閃爍提示有新的下載任務(wù)直到下載任務(wù)完場(chǎng)提示,接下來通過本文介紹vuecli+AXdownload下載組件封裝?+css3下載懸浮球動(dòng)畫效果,需要的朋友可以參考下2024-05-05
vue項(xiàng)目如何讀取本地json文件數(shù)據(jù)實(shí)例
很多時(shí)候我們需要從本地讀取JSON文件里面的內(nèi)容,這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目如何讀取本地json文件數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2023-06-06
Vue3如何根據(jù)搜索框內(nèi)容跳轉(zhuǎn)至本頁(yè)面指定位置
在開發(fā)中我們經(jīng)常遇到這樣的需求,根據(jù)要求跳轉(zhuǎn)至本頁(yè)面指定位置,這篇文章主要給大家介紹了關(guān)于Vue3如何根據(jù)搜索框內(nèi)容跳轉(zhuǎn)至本頁(yè)面指定位置的相關(guān)資料,需要的朋友可以參考下2022-11-11
idea編譯器vue縮進(jìn)報(bào)錯(cuò)問題場(chǎng)景分析
idea編譯器出現(xiàn)Vue縮進(jìn)報(bào)錯(cuò),怎么解決呢,很多朋友遇到這個(gè)問題都很棘手,不知該如何解決,今天小編給大家通過場(chǎng)景分析介紹解決方案,需要的朋友參考下吧2021-07-07

