JS使用window.requestAnimationFrame()對列表切片進(jìn)行渲染
背景
正常的后端返回幾十條數(shù)據(jù)數(shù)據(jù)直接渲染還好,但是現(xiàn)在需求是表格上面的每一行數(shù)據(jù)都要編輯的操作(各種下拉和輸入),最后整體保存,保存完成后再次進(jìn)來回顯之前的已經(jīng)填的數(shù)據(jù),現(xiàn)在的問題是每次回顯比較慢(接口數(shù)據(jù)很快就返回了),在頁面很卡頓,體驗(yàn)很不好。
問題排查
通過審查代碼也沒發(fā)現(xiàn)什么問題,找不出原因,代碼邏輯是很簡單的,就是等接口數(shù)據(jù)返回然后賦值給表格展示,到頁面就loading了。。
問題解決
之前看到了列表可以切片渲染,就是前端對數(shù)據(jù)做一個分頁然后按照順序加載,假設(shè)每個頁面都有 limit 記錄,那么數(shù)據(jù)可以分為 Math.ceil(total/limit) 個頁面。然后可以使用setTimeout順序渲染頁面,一次只渲染一個頁面。
- 使用setTimeout
const renderList(list = []){ const total = list.length const page = 0 const limit = 200 const totalPage = Math.ceil(total / limit) const render = (page) => { if (page >= totalPage) return setTimeout(() => { for (let i = page * limit; i < page * limit + limit; i++) { const item = list[i] if(item) { // ...這里寫當(dāng)前表格賦值邏輯 // this.tableData.push(item) } } render(page + 1) },0) } render(page) }
- 使用requestAnimationFrame來代替 setTimeout
readerList(list = []) { const total = list.length const page = 0 const limit = 10 const totalPage = Math.ceil(total / limit) const render = (page) => { if (page >= totalPage) return for (let i = page * limit; i < page * limit + limit; i++) { const item = list[i] if(item) { // ...這里寫當(dāng)前表格賦值邏輯 // this.tableData.push(item) } } requestAnimationFrame(() => { render(page + 1) }) } requestAnimationFrame(() => { render(page) }) }
關(guān)于requestAnimationFrame
window.requestAnimationFrame() 告訴瀏覽器——你希望執(zhí)行一個動畫,并且要求瀏覽器在下次重繪之前調(diào)用指定的回調(diào)函數(shù)更新動畫。該方法需要傳入一個回調(diào)函數(shù)作為參數(shù),該回調(diào)函數(shù)會在瀏覽器下一次重繪之前執(zhí)行。
備注: 若你想在瀏覽器下次重繪之前繼續(xù)更新下一幀動畫,那么回調(diào)函數(shù)自身必須再次調(diào)用 requestAnimationFrame()。requestAnimationFrame() 是一次性的。
requestAnimationFrame 比起 setTimeout、setInterval的優(yōu)勢主要有兩點(diǎn):
- requestAnimationFrame 會把每一幀中的所有DOM操作集中起來,在一次重繪或回流中就完成,并且重繪或回流的時間間隔緊緊跟隨瀏覽器的刷新頻率,一般來說,這個頻率為每秒60幀。
- 在隱藏或不可見的元素中,requestAnimationFrame 將不會進(jìn)行重繪或回流,這當(dāng)然就意味著更少的cpu,gpu和內(nèi)存使用量。
以上就是JS使用window.requestAnimationFrame()對列表切片進(jìn)行渲染的詳細(xì)內(nèi)容,更多關(guān)于JS window.requestAnimationFrame()的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
純js實(shí)現(xiàn)仿QQ郵箱彈出確認(rèn)框
仿QQ郵箱的彈出層,彈出確認(rèn)框,主要是用火狐的firebug把html和css扣了下來,沒有做封裝,就定義了一個拖動事件. 大家可以封裝自己的彈出窗,嘿嘿!2015-04-04JavaScript簡單遍歷DOM對象所有屬性的實(shí)現(xiàn)方法
這篇文章主要介紹了JavaScript簡單遍歷DOM對象所有屬性的實(shí)現(xiàn)方法,涉及JavaScript針對頁面元素屬性操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10JavaScript Event Loop相關(guān)原理解析
這篇文章主要介紹了JavaScript Event Loop相關(guān)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06詳解javascript 正則表達(dá)式之分組與前瞻匹配
本文主要講解javascript 的正則表達(dá)式中的分組匹配與前瞻匹配的,需要對正則的有基本認(rèn)識,本人一直對兩種匹配模棱不清,還有不清楚的朋友跟隨腳本之家小編一起看看吧2018-05-05weui框架實(shí)現(xiàn)上傳、預(yù)覽和刪除圖片功能代碼
weui框架暫時只有css文件,并沒有js文件實(shí)現(xiàn)其功能,我在其html+css后面增加了js實(shí)現(xiàn)其功能,為大家提供方便,也為自己保存記錄。具體實(shí)例代碼大家參考下本文2017-08-08