關(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 里面銷(xiāo)毀掉 監(jiān)聽(tīng)的時(shí)間和 MutationObserver 監(jiān)聽(tīng)的事件,避免事件一直在頁(yè)面里面,消耗內(nèi)存。
最后開(kāi)發(fā)完后,對(duì)比了下和之前使用的插件,原生js處理的體驗(yàn)比插件反應(yīng)快,插件給人的感覺(jué)盾一點(diǎn)
ok 這就是關(guān)于 vue 結(jié)合原生js 解決echarts resize問(wèn)題 的開(kāi)發(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-05Ant Design的可編輯Tree的實(shí)現(xiàn)操作
這篇文章主要介紹了Ant Design的可編輯Tree的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10vscode中prettier和eslint換行縮進(jìn)沖突的問(wèn)題
這篇文章主要介紹了vscode中prettier和eslint換行縮進(jìn)沖突的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10HTML頁(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做開(kāi)發(fā),一種是企業(yè)級(jí)的單頁(yè)面應(yīng)用。2023-02-02ElementUI實(shí)現(xiàn)el-table行列合并的操作步驟
在前端開(kāi)發(fā)中,數(shù)據(jù)展示一直是一個(gè)重要的部分,而表格則是數(shù)據(jù)展示最常見(jiàn)的形式之一,ElementUI 是餓了么前端團(tuán)隊(duì)推出的一款基于 Vue 的 UI 組件庫(kù),其中的 el-table 組件是一個(gè)功能強(qiáng)大且靈活的表格組件,今天我們要詳細(xì)探討的是 el-table 的行列合并操作2024-08-08Vue3中進(jìn)行二維碼的生成與解碼實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Vue3中進(jìn)行二維碼的生成與解碼實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03