詳解前端如何對超大量數(shù)據(jù)進(jìn)行渲染
前端性能優(yōu)化的方向
- 分批渲染DOM:避免一次性渲染大量DOM,可以減少瀏覽器的性能壓力。
- 集中進(jìn)行DOM操作:將多次DOM操作集中在一起進(jìn)行,減少不必要的渲染。
- 移除可視區(qū)域以外的DOM:對于不在可視區(qū)域的DOM元素,可以將其從DOM樹中移除,以減少內(nèi)存占用和渲染負(fù)擔(dān)。
實(shí)現(xiàn)大量數(shù)據(jù)渲染的方法
1. 使用定時(shí)器
方法概述:通過setInterval定時(shí)器分批插入DOM元素,每次處理一定數(shù)量的節(jié)點(diǎn)。
代碼示例:
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代替定時(shí)器
方法概述:使用requestAnimationFrame來代替setInterval,它會在瀏覽器下一次重繪之前執(zhí)行回調(diào)函數(shù),從而更加精確地控制DOM操作的時(shí)機(jī)。
代碼示例:
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. 使用虛擬滾動(dòng)
方法概述:虛擬滾動(dòng)技術(shù)通過只渲染可視區(qū)域的數(shù)據(jù)來提高列表的渲染性能,并根據(jù)頁面滾動(dòng)動(dòng)態(tài)添加或刪除DOM節(jié)點(diǎn)。
實(shí)現(xiàn)過程:
- 設(shè)置父節(jié)點(diǎn)的
position為relative,子節(jié)點(diǎn)的position為absolute,并通過transform屬性設(shè)置子節(jié)點(diǎn)的位置。 - 使用
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) => {
// ...代碼邏輯同上...
};
};
虛擬滾動(dòng)的scroll事件處理
方法概述:通過監(jiān)聽滾動(dòng)事件并結(jié)合閾值(threshold)來決定是否添加或刪除DOM節(jié)點(diǎn),以及是否觸發(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);
};
到此這篇關(guān)于詳解前端如何對超大量數(shù)據(jù)進(jìn)行渲染的文章就介紹到這了,更多相關(guān)前端數(shù)據(jù)渲染內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS 獲取瀏覽器和屏幕寬高等信息的實(shí)現(xiàn)思路及代碼
本節(jié)代碼主要使用了Document對象關(guān)于窗口的一些屬性,附實(shí)現(xiàn)代碼及源程序解決,有需求的朋友可以參考下2013-07-07
使用webpack搭建pixi.js開發(fā)環(huán)境
這篇文章主要介紹了使用webpack搭建pixi.js開發(fā)環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL錯(cuò)誤的解決方法
這篇文章主要介紹了JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL錯(cuò)誤的解決方法,涉及針對字符串參數(shù)的處理方法,需要的朋友可以參考下2016-08-08
小程序獲取用戶信息的兩種方法詳解(getUserProfile和頭像昵稱填寫)
小程序獲取用戶信息這部分其實(shí)不難,但是,他有點(diǎn)麻煩,下面這篇文章主要給大家介紹了關(guān)于小程序獲取用戶信息的兩種方法,主要使用的是getUserProfile和頭像昵稱填寫這兩種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
微信小程序?qū)崿F(xiàn)的涂鴉功能示例【附源碼下載】
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)的涂鴉功能,涉及微信小程序事件響應(yīng)及畫筆的相關(guān)操作技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下2018-01-01
分享js粘帖屏幕截圖到web頁面插件screenshot-paste
這篇文章主要為大家分享了js粘帖屏幕截圖到web頁面插件screenshot-paste的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03

