詳解前端如何對超大量數(shù)據(jù)進行渲染
前端性能優(yōu)化的方向
- 分批渲染DOM:避免一次性渲染大量DOM,可以減少瀏覽器的性能壓力。
- 集中進行DOM操作:將多次DOM操作集中在一起進行,減少不必要的渲染。
- 移除可視區(qū)域以外的DOM:對于不在可視區(qū)域的DOM元素,可以將其從DOM樹中移除,以減少內存占用和渲染負擔。
實現(xiàn)大量數(shù)據(jù)渲染的方法
1. 使用定時器
方法概述:通過setInterval
定時器分批插入DOM元素,每次處理一定數(shù)量的節(jié)點。
代碼示例:
export default (element, data) => { const fragment = document.createDocumentFragment(); let timer = setInterval(() => { for (let i = 0; i < 20; i++) { const item = data.shift(); if (!item) { clearInterval(timer); break; } const div = document.createElement('div'); div.innerText = item.string; div.setAttribute('class', 'item'); div.style.backgroundColor = item.color; fragment.appendChild(div); } element.appendChild(fragment); }, 100); };
2. 用requestAnimationFrame代替定時器
方法概述:使用requestAnimationFrame
來代替setInterval
,它會在瀏覽器下一次重繪之前執(zhí)行回調函數(shù),從而更加精確地控制DOM操作的時機。
代碼示例:
export default (element, data) => { requestAnimationFrame(() => step(element, data)); }; const step = (element, data) => { const fragment = document.createDocumentFragment(); for (let i = 0; i < 20; i++) { const item = data.shift(); if (!item) { break; } const div = document.createElement('div'); div.innerText = item.string; div.setAttribute('class', 'item'); div.style.backgroundColor = item.color; fragment.appendChild(div); } element.appendChild(fragment); data.length && requestAnimationFrame(() => step(element, data)); };
3. 使用虛擬滾動
方法概述:虛擬滾動技術通過只渲染可視區(qū)域的數(shù)據(jù)來提高列表的渲染性能,并根據(jù)頁面滾動動態(tài)添加或刪除DOM節(jié)點。
實現(xiàn)過程:
- 設置父節(jié)點的
position
為relative
,子節(jié)點的position
為absolute
,并通過transform
屬性設置子節(jié)點的位置。 - 使用
boundary
數(shù)組記錄渲染區(qū)域的上下邊界。 - 使用
startIndex
和endIndex
來確定需要渲染的數(shù)據(jù)范圍。 - 定義
step
變量表示每次批量添加或刪除的DOM數(shù)量,以及threshold
閾值來觸發(fā)DOM的添加或刪除。
代碼示例:
export default (element, data) => { const boundary = [0, 0]; let startIndex = 0; let endIndex = 0; const step = 10; const threshold = 200; const init = () => { element.style.position = 'relative'; drop(); initScroll(element); }; const drop = () => { // ...代碼邏輯同上... }; const rise = () => { // ...代碼邏輯同上... }; const createElement = (item, mode) => { // ...代碼邏輯同上... }; const initScroll = (element) => { // ...代碼邏輯同上... }; };
虛擬滾動的scroll事件處理
方法概述:通過監(jiān)聽滾動事件并結合閾值(threshold
)來決定是否添加或刪除DOM節(jié)點,以及是否觸發(fā)數(shù)據(jù)的添加或刪除。
代碼示例:
export const scroll = (element, func) => { let top = 0; return _.throttle(() => { const { scrollTop, scrollHeight } = element; if (scrollTop > top) { top = scrollTop; func({ mode: Mode.append, scrollTop, scrollBottom: scrollHeight - scrollTop - element.clientHeight }); } else if (scrollTop < top) { top = scrollTop; func({ mode: Mode.before, scrollTop, scrollBottom: scrollHeight - scrollTop - element.clientHeight }); } }, 100); };
到此這篇關于詳解前端如何對超大量數(shù)據(jù)進行渲染的文章就介紹到這了,更多相關前端數(shù)據(jù)渲染內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JS 獲取瀏覽器和屏幕寬高等信息的實現(xiàn)思路及代碼
本節(jié)代碼主要使用了Document對象關于窗口的一些屬性,附實現(xiàn)代碼及源程序解決,有需求的朋友可以參考下2013-07-07使用webpack搭建pixi.js開發(fā)環(huán)境
這篇文章主要介紹了使用webpack搭建pixi.js開發(fā)環(huán)境,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL錯誤的解決方法
這篇文章主要介紹了JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL錯誤的解決方法,涉及針對字符串參數(shù)的處理方法,需要的朋友可以參考下2016-08-08小程序獲取用戶信息的兩種方法詳解(getUserProfile和頭像昵稱填寫)
小程序獲取用戶信息這部分其實不難,但是,他有點麻煩,下面這篇文章主要給大家介紹了關于小程序獲取用戶信息的兩種方法,主要使用的是getUserProfile和頭像昵稱填寫這兩種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-08-08分享js粘帖屏幕截圖到web頁面插件screenshot-paste
這篇文章主要為大家分享了js粘帖屏幕截圖到web頁面插件screenshot-paste的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-03-03