最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

微信小程序虛擬列表的應(yīng)用實例

 更新時間:2021年12月28日 15:51:08   作者:劉煎蛋  
虛擬列表不是什么神秘的東西,下面這篇文章主要給大家介紹了關(guān)于微信小程序虛擬列表的應(yīng)用實例,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

股票熱門榜單有4000多條,渲染到頁面上在盤中時還得實時更新,如果采用接口和分頁,當(dāng)下拉幾十頁的時候頁面會變的越來越卡并且還得實時更新,最后的做法是一開始數(shù)據(jù)就從ws傳遞過來,我們只需要傳起始下標(biāo)和結(jié)束下標(biāo)即可,在頁面上我們也只生成幾個標(biāo)簽。大大減輕了渲染壓力。

什么是虛擬列表?

就只指渲染可視區(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ū)域是因為數(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至少兩次的寫入。

文中編寫的demo在這里,有需要的可以進(jìn)行參考。

總結(jié)

到此這篇關(guān)于微信小程序虛擬列表應(yīng)用的文章就介紹到這了,更多相關(guān)小程序虛擬列表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS?TypeScript的Map對象及聯(lián)合類型實戰(zhàn)

    JS?TypeScript的Map對象及聯(lián)合類型實戰(zhàn)

    這篇文章主要介紹了JS?TypeScript的Map對象及聯(lián)合類型實戰(zhàn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • JavaScript 解決ajax中parsererror錯誤案例詳解

    JavaScript 解決ajax中parsererror錯誤案例詳解

    這篇文章主要介紹了JavaScript 解決ajax中parsererror錯誤案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • JS實現(xiàn)的DOM插入節(jié)點操作示例

    JS實現(xiàn)的DOM插入節(jié)點操作示例

    這篇文章主要介紹了JS實現(xiàn)的DOM插入節(jié)點操作,結(jié)合實例形式分析了javascript針對頁面dom元素動態(tài)操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2018-04-04
  • 原生JS實現(xiàn)隱藏顯示圖片 JS實現(xiàn)點擊切換圖片效果

    原生JS實現(xiàn)隱藏顯示圖片 JS實現(xiàn)點擊切換圖片效果

    這篇文章主要為大家詳細(xì)介紹了原生JS實現(xiàn)隱藏顯示圖片,JS實現(xiàn)點擊切換圖片效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 詳談js對url進(jìn)行編碼和解碼(三種方式的區(qū)別)

    詳談js對url進(jìn)行編碼和解碼(三種方式的區(qū)別)

    下面小編就為大家?guī)硪黄斦刯s對url進(jìn)行編碼和解碼(三種方式的區(qū)別)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • JavaScript中的this引用(推薦)

    JavaScript中的this引用(推薦)

    this是javascript的一個關(guān)鍵字,隨著函數(shù)使用場合不同,this的值會發(fā)生變化。這篇文章主要介紹了JavaScript中的this引用的相關(guān)資料,非常不錯,需要的朋友可以參考下
    2016-08-08
  • 原生js實現(xiàn)拖拽移動與縮放效果

    原生js實現(xiàn)拖拽移動與縮放效果

    這篇文章主要為大家詳細(xì)介紹了原生js實現(xiàn)拖拽移動與縮放效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 你可能不知道的CORS跨域資源共享

    你可能不知道的CORS跨域資源共享

    這篇文章主要給大家介紹了關(guān)于CORS跨域資源共享的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用CORS具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • JS中作用域和變量提升(hoisting)的深入理解

    JS中作用域和變量提升(hoisting)的深入理解

    相信大家也都發(fā)現(xiàn)了,在網(wǎng)上關(guān)于JS的變量和作用域的文章有很多,但真正能講清楚,能深入理解的文章很少。在閱讀了很多人的文章以后,我決定綜合起來,結(jié)合實際代碼,希望能夠以一個比較清楚完整的方式讓大家真正理解。有需要的朋友們下面來一起看看吧。
    2016-10-10
  • 微信小程序數(shù)據(jù)存儲與取值詳解

    微信小程序數(shù)據(jù)存儲與取值詳解

    這篇文章主要為大家詳細(xì)介紹了微信小程序數(shù)據(jù)存儲與取值的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論

武陟县| 平度市| 广丰县| 朝阳市| 洱源县| 庄浪县| 广饶县| 武乡县| 紫阳县| 娄烦县| 永德县| 利川市| 乌鲁木齐县| 成武县| 五常市| 安国市| 陇南市| 陇西县| 洮南市| 塔河县| 上饶县| 金寨县| 江西省| 昌黎县| 朝阳市| 吉林市| 开封县| 广州市| 三亚市| 独山县| 高密市| 太保市| 沂源县| 杭锦旗| 临夏市| 鹤峰县| 济南市| 原平市| 洪雅县| 金塔县| 三门县|