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

