溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

微信小程序虛擬列表怎么用

發(fā)布時間:2021-12-28 17:06:44 來源:億速云 閱讀:386 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)微信小程序虛擬列表怎么用,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

什么是虛擬列表?

微信小程序虛擬列表怎么用

就只指渲染可視區(qū)域內(nèi)的標(biāo)簽,在滾動的時候不斷切換起始和結(jié)束的下標(biāo)來更新視圖,同時計算偏移。

demo效果

微信小程序虛擬列表怎么用

準(zhǔn)備工作

  • 計算一屏可展示多少個列表。

  • 盒子的高度。

  • 滾動中起始位置。

  • 滾動中結(jié)束位置。

  • 滾動偏移量。

屏高&盒子高度

在小程序中我們可以利用wx.createSelectorQuery來獲取屏高以及盒子的高度。

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可以理解為距離頂部滾過了多少個盒子 / 盒子的高度 = 起始下標(biāo)

起始 + 頁面可視區(qū)域能展示多少個盒子 = 結(jié)束 

起始 * 盒子高度 = 偏移

computed: {
    visibleData() {
        return this.data.slice(this.start, Math.min(this.end, this.data.length))
    },
}

當(dāng)start以及end改變的時候我們會使用slice(this.start,this.end)進(jìn)行數(shù)據(jù)變更,這樣標(biāo)簽的內(nèi)容就行及時進(jìn)行替換。

優(yōu)化

快速滾動時底部會出現(xiàn)空白區(qū)域是因?yàn)閿?shù)據(jù)還沒加載完成,我們可以做渲染三屏來保證滑動時數(shù)據(jù)加載的比較及時。

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ù)留偏移的計算就要修改下:this.offsetY = this.start * this.boxhigh - this.boxhigh * this.prevCount

滑動動時候start、end、offsetY一直在變更,頻繁調(diào)用setData,很有可能導(dǎo)致小程序內(nèi)存超出閃退,這里我們在滑動的時候做個節(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('滾動================>>>>>>>')
        this.deliquate(scrollTop);
    }

微信小程序虛擬列表怎么用

從上圖可以看出,每次滾動差不多都降低了setData至少兩次的寫入。

關(guān)于“微信小程序虛擬列表怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI