完美解决多个Echarts图表自适应窗口、父容器宽高,并进行性能优化

场景

很多时候我们会在绘制echarts图表时,使用以下方法监听浏览器尺寸变化,让图表resize()完成自适应

window.addEventListener('resize', ()=>{wordCloudChart.resize()
})

然后,这种自适应真的足够周全嘛?有些时候,比如在B端,经常会有侧边栏的宽度变化影响我们工作区各种div的尺寸自动变化,如果淡村使用addEventListener,那么图表是不会resize()的,问题就出现了。这时候就迫切地需要echarts能够随父容器尺寸变化而响应式调整自身尺寸

解决方案 - ResizeObserver API

浏览器提供的这个API可以监听指定单个element元素的尺寸变化,并在变化时触发对应的回调函数,借此我们可以来监听父容器尺寸变化从而触发resize()

举个例子

<el-col :span="9" class="chartContainer" id="wc"><div class="title">词云</div><div id="wordCloud" class="grid-content bg-purple card" ref="wordCloud"></div>
</el-col>
wordCloud.setOption(wcOptions)
const watchChartWc = new ResizeObserver(() => {wordCloud.resize()
})// 使用observe开启监听, onObserve可以取消监听
watchChartWc.observe(document.getElementById('wc'))

ResizeObserver.observe()接受两个参数,第一个是指定的单个element, 第二个是options

但是, 这又会遇到一个问题, 当页面中同时存在多个图表时,侧边栏宽度变化引起每个图表resize()时,页面性能会严重下降, 侧边栏的动画会出现特别明显的卡顿。解决方法是: 防抖

所以完整的版本应当为:

wordCloud.setOption(wcOptions)
const watchChartWc = new ResizeObserver(() => {debounce(() => { wordCloud.resize() }, 300)
})// 使用observe开启监听, onObserve可以取消监听
watchChartWc.observe(document.getElementById('wc'))

其中debounce()为自己封装并引入的防抖函数

性能优化

若一个页面中有多个图表,且它们会因为同一个原因resize(),比如上面说的,B端中侧边栏宽度变化带来的图表父容器宽度变化从而引起图表resize(),多个图表都只因为这个原因触发resize(),那么这时候就不应该创建多个ResizeObserver去分别监听每个图表的父容器, 否则就算防抖,展开会收起侧边栏时,页面仍然会出现肉眼可见的明显卡顿。这种情况下,因为每个父容器都是随着页面最大的div变化而变化的,所以这时候应该用ResizeObserver去监听页面最大的div。这种方法下,肉眼可见的卡顿消失了,非常丝滑.

页面结构大致如下

<template><div id="container"><div> ... </div></div>
</template>

注意:这种情况下要异步操作,在所有图表都渲染完毕后,再开启监听

const watchCharts = new ResizeObserver(() => {debounce(() => { wordCloud.resize()userChart.resize()courseChart.resize()// ...}, 300)
})// 使用observe开启监听, onObserve可以取消监听
watchCharts.observe(document.getElementById('container'))

写在最后

如果父容器是自适应的, 那么使用了ResizeObserver就不需要再使用window.addEventListener('resize', ()=>{})

最后请不要忘记在页面销毁前调用unobserve()取消ResizeObserver的监听:

watchChartWc.unobserve(document.getElementById('wc'))

关于ResizeObserver更多请看MDN - ResizeObserver

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多元正态分布(Multivariate Normal Distribution)

多元正态分布&#xff08;Multivariate Normal Distribution&#xff09;&#xff0c;也称为多变量高斯分布&#xff0c;是单变量正态分布&#xff08;高斯分布&#xff09;在多维空间中的推广。它是描述位于多维空间中的随机向量的分布情况的一种概率分布。多元正态分布在统计…

基于springboot+vue的城镇保障性住房管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

练习 3 Web [ACTF2020 新生赛]Upload

[ACTF2020 新生赛]Upload1 中间有上传文件的地方&#xff0c;试一下一句话木马 txt 不让传txt 另存为tlyjpg&#xff0c;木马文件上传成功 给出了存放目录&#xff1a; Upload Success! Look here~ ./uplo4d/06a9d80f64fded1e542a95e6d530c70a.jpg 下一步尝试改木马文件后缀…

云片 3.1(日常实习)面经

1、什么时候开始学习的前端 2、平常通过哪些方式学习 3、遇到bug怎么解决的 4、元素水平居中 5、display有哪些属性 6、align-items除了center还有哪些属性 7、display:none和visibility:hidden区别 8、常用的计量单位有哪些 9、rem和em是相对什么的 10、vw和vh有了解…

从头构建gpt2 基于Transformer

从头构建gpt2 基于Transformer VX关注{晓理紫|小李子}&#xff0c;获取技术推送信息&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持&#xff01;&#xff01; 如果你感觉对你有所帮助&#xff0c;请关注我。 源码获取 VX关注晓理紫并回复“chatgpt…

CSS 自测题

盒模型的宽度计算 默认为标准盒模型 box-sizing:content-box; offsetWidth (内容宽度内边距 边框)&#xff0c;无外边距 答案 122px通过 box-sizing: border-box; 可切换为 IE盒模型 offsetWidth width 即 100px margin 纵向重叠 相邻元素的 margin-top 和 margin-bottom 会发…

leetcode-简单

448. 找到所有数组中消失的数字 硬解 时间O(n)&#xff0c;空间O(n) class Solution { public:vector<int> findDisappearedNumbers(vector<int>& nums) {vector<int> result;vector<int> tem(nums.size()1, 0);for(int i: nums){tem[i] 1;}for…

Benchmark学习笔记

小记一篇Benchmark的学习笔记 1.什么是benchmark 在维基百科中&#xff0c;是这样子讲的 “As computer architecture advanced, it became more difficult to compare the performance of various computer systems simply by looking at their specifications.Therefore, te…

python标识符、变量和常量

一、保留字与标识符 1.1保留字 保留字是指python中被赋予特定意义的单词&#xff0c;在开发程序时&#xff0c;不可以把这些保留字作为变量、函数、类、模块和其它对象的名称来使用。 比如&#xff1a;and、as、def、if、import、class、finally、with等 查询这些关键字的方…

【LeetCode】升级打怪之路 Day 11 加餐:单调队列

今日题目&#xff1a; 239. 滑动窗口最大值 | LeetCode 今天学习了单调队列这种特殊的数据结构&#xff0c;思路很新颖&#xff0c;值得学习。 Problem&#xff1a;单调队列 【必会】 与单调栈类似&#xff0c;单调队列也是一种特殊的数据结构&#xff0c;它相比与普通的 que…

【NR 定位】3GPP NR Positioning 5G定位标准解读(一)

目录 前言 1. 3GPP规划下的5G技术演进 2. 5G NR定位技术的发展 2.1 Rel-16首次对基于5G的定位技术进行标准化 2.2 Rel-17进一步提升5G定位技术的性能 3. Rel-18 关于5G定位技术的新方向、新进展 3.1 Sidelink高精度定位功能 3.2 针对上述不同用例&#xff0c;3GPP考虑按…

自动驾驶---Motion Planning之Speed Boundary(上)

1 背景 在上篇博客《自动驾驶---Motion Planning之Path Boundary》中,笔者主要介绍了path boundary的一些内容,通过将道路中感兴趣区域的动静态障碍物投影到车道坐标系中,用于确定L或者S的边界,并利用道路信息再确定Speed的边界,最后结合粗糙的速度曲线和路径曲线,即可使…

Go-知识简短变量声明

Go-知识简短变量声明 1. 简短变量声明符2. 简短变量赋值可能会重新声明3. 简短变量赋值不能用于函数外部4. 简短变量赋值作用域问题5. 总结 githuio地址&#xff1a;https://a18792721831.github.io/ 1. 简短变量声明符 在Go语言中&#xff0c;可以使用关键字var或直接使用简短…

【STK】手把手教你利用STK进行仿真-STK软件基础02 STK系统的软件界面01 STK的界面窗口组成

STK系统是Windows窗口类型的桌面应用软件,功能非常强大。在一个桌面应用软件中集成了仿真对象管理、仿真对象属性参数、设置、空间场景二三维可视化、场景显示控制欲操作、仿真结果报表定制与分析、对象数据管理、仿真过程控制、外部接口连接和系统集成编程等复杂的功能。 STK…

SpringBoot之Actuator的两种监控模式

SpringBoot之Actuator的两种监控模式 springboot提供了很多的检测端点(Endpoint),但是默认值开启了shutdown的Endpoint&#xff0c;其他默认都是关闭的,可根据需要自行开启 文章目录 SpringBoot之Actuator的两种监控模式1. pom.xml2. 监控模式1. HTTP2. JMX 1. pom.xml <de…

力扣 第 125 场双周赛 解题报告 | 珂学家 | 树形DP + 组合数学

前言 整体评价 T4感觉有简单的方法&#xff0c;无奈树形DP一条路上走到黑了&#xff0c;这场还是有难度的。 T1. 超过阈值的最少操作数 I 思路: 模拟 class Solution {public int minOperations(int[] nums, int k) {return (int)Arrays.stream(nums).filter(x -> x <…

VM虚拟机无法传输文件(更新时间24/3/3)

出现这个问题一般是未安装VMware Tools 以下为手动安装教程及可能出现的问题的解决方法&#xff1a; 1. 准备安装 2.用cmd手动启动安装 3. 安装过程默认即可&#xff0c;直接一直下一步 4.安装完成后会自动重启虚拟机&#xff08;没有的话手动重启即可&#xff09; 5.重启以后…

Web应用安全威胁与防护措施

本文已收录至《全国计算机等级考试——信息 安全技术》专栏 由于极其容易出现漏洞、并引发安全事故&#xff0c;因此数据隐私的保护是目前绝大多数企业不可绕过的运维环节。不过&#xff0c;许多中小型企业往往会错误地认为只有大型企业才会成为黑客的目标。而实际统计数字却截…

StarCoder2模型,释放你的大模型编码潜能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

DeepSpeed-Chat RLHF 阶段代码解读(0) —— 原始 PPO 代码解读

为了理解 DeepSpeed-Chat RLHF 的 RLHF 全部过程&#xff0c;这个系列会分三篇文章分别介绍&#xff1a; 原始 PPO 代码解读RLHF 奖励函数代码解读RLHF PPO 代码解读 这是系列的第一篇文章&#xff0c;我们来一步一步的看 PPO 算法的代码实现&#xff0c;对于 PPO 算法原理不太…