微信小程序虛擬列表的應(yīng)用實(shí)例
前言
股票熱門榜單有4000多條,渲染到頁(yè)面上在盤中時(shí)還得實(shí)時(shí)更新,如果采用接口和分頁(yè),當(dāng)下拉幾十頁(yè)的時(shí)候頁(yè)面會(huì)變的越來(lái)越卡并且還得實(shí)時(shí)更新,最后的做法是一開(kāi)始數(shù)據(jù)就從ws傳遞過(guò)來(lái),我們只需要傳起始下標(biāo)和結(jié)束下標(biāo)即可,在頁(yè)面上我們也只生成幾個(gè)標(biāo)簽。大大減輕了渲染壓力。
什么是虛擬列表?
就只指渲染可視區(qū)域內(nèi)的標(biāo)簽,在滾動(dòng)的時(shí)候不斷切換起始和結(jié)束的下標(biāo)來(lái)更新視圖,同時(shí)計(jì)算偏移。
demo效果
準(zhǔn)備工作
- 計(jì)算一屏可展示多少個(gè)列表。
- 盒子的高度。
- 滾動(dòng)中起始位置。
- 滾動(dòng)中結(jié)束位置。
- 滾動(dòng)偏移量。
屏高&盒子高度
在小程序中我們可以利用wx.createSelectorQuery來(lái)獲取屏高以及盒子的高度。
getEleInfo( ele ) { return new Promise( ( resolve, reject ) => { const query = wx.createSelectorQuery().in(this); query.select( ele ).boundingClientRect(); query.selectViewport().scrollOffset(); query.exec( res => { resolve( res ); }) }) }, this.getEleInfo('.stock').then( res => { if (!res[0]) retuen; // 屏高 this.screenHeight = res[1].scrollHeight; // 盒子高度 this.boxhigh = res[0].height; })
起始&結(jié)束&偏移
onPageScroll(e) { let { scrollTop } = e; this.start = Math.floor(scrollTop / this.boxhigh); this.end = this.start + this.visibleCount; this.offsetY = this.start * this.boxhigh; }
scrollTop可以理解為距離頂部滾過(guò)了多少個(gè)盒子 / 盒子的高度 = 起始下標(biāo)
起始 + 頁(yè)面可視區(qū)域能展示多少個(gè)盒子 = 結(jié)束?
起始 * 盒子高度 = 偏移
computed: { visibleData() { return this.data.slice(this.start, Math.min(this.end, this.data.length)) }, }
當(dāng)start以及end改變的時(shí)候我們會(huì)使用slice(this.start,this.end)進(jìn)行數(shù)據(jù)變更,這樣標(biāo)簽的內(nèi)容就行及時(shí)進(jìn)行替換。
優(yōu)化
快速滾動(dòng)時(shí)底部會(huì)出現(xiàn)空白區(qū)域是因?yàn)閿?shù)據(jù)還沒(méi)加載完成,我們可以做渲染三屏來(lái)保證滑動(dòng)時(shí)數(shù)據(jù)加載的比較及時(shí)。
prevCount() { return Math.min(this.start, this.visibleCount); }, nextCount() { return Math.min(this.visibleCount, this.data.length - this.end); }, visibleData() { let start = this.start - this.prevCount, end = this.end + this.nextCount; return this.data.slice(start, Math.min(end, this.data.length)) },
如果做了前屏預(yù)留偏移的計(jì)算就要修改下:this.offsetY = this.start * this.boxhigh - this.boxhigh * this.prevCount
滑動(dòng)動(dòng)時(shí)候start、end、offsetY一直在變更,頻繁調(diào)用setData,很有可能導(dǎo)致小程序內(nèi)存超出閃退,這里我們?cè)诨瑒?dòng)的時(shí)候做個(gè)節(jié)流,稀釋setData執(zhí)行頻率。
mounted() { this.deliquate = this.throttle(this.changeDeliquate, 130) }, methods: { throttle(fn, time) { var previous = 0; return function(scrollTop) { let now = Date.now(); if ( now - previous > time ) { fn(scrollTop) previous = now; } } }, changeDeliquate(scrollTop) { this.start = Math.floor(scrollTop / this.boxhigh); this.end = this.start + this.visibleCount; this.offsetY = this.start * this.boxhigh; console.log('執(zhí)行setData') } }, onPageScroll(e) { let { scrollTop } = e; console.log('滾動(dòng)================>>>>>>>') this.deliquate(scrollTop); }
從上圖可以看出,每次滾動(dòng)差不多都降低了setData至少兩次的寫入。
文中編寫的demo在這里,有需要的可以進(jìn)行參考。
總結(jié)
到此這篇關(guān)于微信小程序虛擬列表應(yīng)用的文章就介紹到這了,更多相關(guān)小程序虛擬列表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
bootstrap模態(tài)框消失問(wèn)題的解決方法
這篇文章主要為大家詳細(xì)整理了bootstrap模態(tài)框消失不消失各種問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12javascript實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲
本文很簡(jiǎn)單,給大家分享了一段使用javascript實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲的代碼,算是對(duì)自己學(xué)習(xí)javascript的一次小小的總結(jié),代碼參考了網(wǎng)友的部分內(nèi)容,推薦給大家,希望對(duì)大家能夠有所幫助。2015-03-03windows系統(tǒng)下簡(jiǎn)單nodejs安裝及環(huán)境配置
相信對(duì)于很多關(guān)注javascript發(fā)展的同學(xué)來(lái)說(shuō),nodejs已經(jīng)不是一個(gè)陌生的詞眼,這里不想談太多的nodejs的相關(guān)信息。只說(shuō)一下,windows系統(tǒng)下簡(jiǎn)單nodejs環(huán)境配置2013-01-01基于javascript html5實(shí)現(xiàn)3D翻書(shū)特效
這篇文章主要介紹了基于javascript html5實(shí)現(xiàn)翻書(shū)特效的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03JS實(shí)現(xiàn)css hover操作的方法示例
這篇文章主要介紹了JS實(shí)現(xiàn)css hover操作的方法,涉及javascript事件響應(yīng)及頁(yè)面元素css屬性動(dòng)態(tài)操作相關(guān)技巧,需要的朋友可以參考下2017-04-04原生js實(shí)現(xiàn)點(diǎn)擊輪播切換圖片
這篇文章主要為大家詳細(xì)介紹了原生js點(diǎn)擊輪播切換圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02JavaScript實(shí)現(xiàn)的多種鼠標(biāo)拖放效果
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的多種鼠標(biāo)拖放效果,涉及JavaScript響應(yīng)鼠標(biāo)事件動(dòng)態(tài)變換頁(yè)面元素屬性的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11js 獲取當(dāng)前web應(yīng)用的上下文路徑實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇js 獲取當(dāng)前web應(yīng)用的上下文路徑實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08JavaScript 限制文本框不可輸入英文單雙引號(hào)的方法
這篇文章主要介紹了JavaScript 限制文本框不可輸入英文單雙引號(hào)的方法的相關(guān)資料,需要的朋友可以參考下2016-12-12