完美解決多個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.pswp.cn/news/716576.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716576.shtml
英文地址,請注明出處:http://en.pswp.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 算法原理不太…