解决页面echarts 图表 resize问题
左侧的菜单栏模块是可以收缩的,点击左上角的 icon 可以收缩,但是点击左上角的icon后,右侧的echarts图并未进行对应的收缩,使用 element-resize-detector 插件能够解决问题(如何解决Vue项目中使用echarts,宽度变化导致图不能resize问题)但是会有点卡顿,所以采用原生的方法来处理,再结合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/>{b}: {c} ({d}%)" }, 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); // 处理浏览器窗口大小变化触发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); // 处理浏览器窗口大小变化触发resize window.addEventListener("resize", this.resizeEchart, true);
关于MutationObserver的使用 参考
最后注意需要beforeDestroy 里面销毁掉 监听的时间和 MutationObserver 监听的事件,避免事件一直在页面里面,消耗内存。
最后开发完后,对比了下和之前使用的插件,原生js处理的体验比插件反应快,插件给人的感觉盾一点
ok 这就是关于 vue 结合原生js 解决echarts resize问题 的开发心得啦 ~希望能给大家一个参考,也希望大家多多支持。
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
暂无评论...
更新日志
2024年11月25日
2024年11月25日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]