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

vxe-list?vue?如何實現(xiàn)下拉框的虛擬列表

 更新時間:2022年06月06日 08:50:44   作者:大猩猩X  
這篇文章主要介紹了vxe-list?vue?如何實現(xiàn)下拉框的虛擬列表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

vxe-list vue下拉框的虛擬列表

vxe-table vxe-list vue 實現(xiàn)下拉框的虛擬列表

虛擬列表的實現(xiàn)原理

只渲染可視區(qū)的 dom 節(jié)點,其余不可見的數(shù)據(jù)卷起來,只會渲染可視區(qū)域的 dom 節(jié)點,提高渲染性能及流暢性,優(yōu)點是支持海量數(shù)據(jù)的渲染;當然也會有缺點:滾動效果相對略差(海量數(shù)據(jù)與滾動效果的取舍問題就看自己的需求嘍);

<div class="my-select">
? ?<input type="text" class="my-select-input" readonly>
? ? <vxe-list class="my-select-wrapper" :loading="loading" :data="list">
? ? ? ? <template v-slot="{ items }">
? ? ? ? ? ? <div class="my-select-option" v-for="item in items" :key="item.value">{{ item.label }}</div>
? ? ? ? </template>
? ? </vxe-list>
</div>
export default {
	data () {
		return {
	      loading: false,
	      list: []
	    }
	},
	created () {
	    this.loading = true
        setTimeout(() => {
            const startTime = Date.now()
            var list = []
            for(var i=0;i<100000;i++){
                list.push({
                    label: '選項'+i,
                    value: i
                })
            }
            this.list = list
            this.loading = false
            this.$nextTick(() => {
                this.$XModal.message({ message: `渲染 ${list.length} 行,用時 ${Date.now() - startTime}毫秒`, status: 'info' })
            })
        }, 200)
	}
}
.my-select {
    width: 200px;
    position: relative;
    background-color: #fff;
}
.my-select-input {
    width: 100%;
    height: 24px;
    border: 1px solid #dcdfe6;
}
.my-select-wrapper {
    position: absolute;
    left: 0;
    top: 26px;
    width: 100%;
    height: 200px;
    background-color: #fff;
    border: 1px solid #dcdfe6;
}
.my-select-option:hover {
    background-color: #f5f7fa;
    cursor: pointer;
}

接下來測試一下

渲染 1w 條只需要 150 毫秒左右

渲染 5w 條只需要 300 毫秒左右

渲染 10w 條只需要 500 毫秒左右

具體用法可以去看 官方文檔,在線運行 http://jsrun.net/CW2Kp/edit

vue虛擬列表實現(xiàn)原理

應用場景

前端的業(yè)務開發(fā)中會遇到不使用分頁方式來加載長列表的需求。如在數(shù)據(jù)長度大于 1000 條情況,DOM 元素的創(chuàng)建和渲染需要的時間成本很高,完整渲染列表所需要的時間不可接受,同時會存在滾動時卡頓問題;

解決該卡頓問題的重點在于如何降低長列表DOM渲染成本問題,文章將介紹通過虛擬列表渲染的方式解決該問題。 

為什么需要虛擬列表

虛擬列表是對長列表的一種優(yōu)化方案。在前端開發(fā)中,會碰到一些不能使用分頁方式來加載列表數(shù)據(jù)的業(yè)務形態(tài),我們稱這種列表叫做長列表。比如,手機端,淘寶商品展示,美團外賣等,數(shù)據(jù)量特別龐大,不適合分頁,以及懶加載,這時候我們可以采用虛擬列表,只展示可視區(qū)域數(shù)據(jù)。

實現(xiàn)思路

虛擬列表的核心思想為可視區(qū)域渲染,在頁面滾動時對數(shù)據(jù)進行截取、復用DOM進行展示的渲染方式。

實現(xiàn)虛擬列表就是處理滾動條滾動后的可見區(qū)域的變更,其中具體步驟如下:

1.計算當前可見區(qū)域起始數(shù)據(jù)的 startIndex

2.計算當前可見區(qū)域結束數(shù)據(jù)的 endIndex

3.計算當前可見區(qū)域的數(shù)據(jù),并渲染到頁面中

4.計算 startIndex 對應的數(shù)據(jù)在整個列表中的偏移位置 startOffset,并設置到列表上

基礎實現(xiàn)

我們首先要考慮的是虛擬列表的 HTML、CSS 如何實現(xiàn):

  • 列表元素(.list-view)使用相對定位
  • 使用一個不可見元素(.list-view-phantom)撐起這個列表,讓列表的滾動條出現(xiàn)
  • 列表的可見元素(.list-view-content)使用絕對定位,left、right、top 設置為 0

html:

<template>
     <div 
    class="list-view"
    :style="{
        height: `${height}px`
    }" 
    @scroll="handleScroll">
        <div
        class="list-view-phantom"       
        :style="{
            height: contentHeight
        }">
        </div>
        <ul
        ref="content"
        class="list-view-content">
            <li
                class="list-view-item"
                :style="{
                    height: itemHeight + 'px'
                }"
                v-for="(item, index) in visibleData" 
                :key="index">
                    {{ item }}
            </li>
        </ul>
  </div>
</template>

script:

<script>
export default {
    name: 'ListView',
    props: {
    data: {
        type: Array,
        default: function() {
            const list = []
            for (let i = 0; i < 1000000; i++) {
                list.push('列表' + i)
            }
            return list
        }
    },
    height: {
        type: Number,
        default: 400
    },
    itemHeight: {
        type: Number,
        default: 30
    },
  },
  computed: {
    contentHeight() {
        return this.data.length * this.itemHeight + 'px';
    }
  },
  mounted() {
      this.updateVisibleData();
  },
  data() {
    return {
      visibleData: []
    };
  },
  methods: {
    updateVisibleData(scrollTop) {
        scrollTop = scrollTop || 0;
        const visibleCount = Math.ceil(this.$el.clientHeight / this.itemHeight); // 取得可見區(qū)域的可見列表項數(shù)量
        const start = Math.floor(scrollTop / this.itemHeight); // 取得可見區(qū)域的起始數(shù)據(jù)索引
        const end = start + visibleCount; // 取得可見區(qū)域的結束數(shù)據(jù)索引
        this.visibleData = this.data.slice(start, end); // 計算出可見區(qū)域?qū)臄?shù)據(jù),讓 Vue.js 更新
        this.$refs.content.style.webkitTransform = `translate3d(0, ${ start * this.itemHeight }px, 0)`; // 把可見區(qū)域的 top 設置為起始元素在整個列表中的位置(使用 transform 是為了更好的性能)
    },
    handleScroll() {
        const scrollTop = this.$el.scrollTop;
        this.updateVisibleData(scrollTop);
    }
  }
}
</script>

css:

<style lang="scss" scoped>
.list-view {
    overflow: auto;
    position: relative;
    border: 1px solid #aaa;
    width: 200px;
}
.list-view-phantom {
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    z-index: -1;
}
.list-view-content {
    left: 0;
    right: 0;
    top: 0;
    position: absolute;
}
.list-view-item {
    padding: 5px;
    color: #666;
    line-height: 30px;
    box-sizing: border-box;
}
</style>

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Vue-router如何實現(xiàn)路由懶加載

    Vue-router如何實現(xiàn)路由懶加載

    在現(xiàn)代前端開發(fā)中,Vue.js憑借其輕量級和易用性,成為了很多開發(fā)者的首選框架,本文將結合實際案例,詳細講解Vue-Router路由懶加載的用法,需要的可以參考下
    2024-11-11
  • Vue.js Ajax動態(tài)參數(shù)與列表顯示實現(xiàn)方法

    Vue.js Ajax動態(tài)參數(shù)與列表顯示實現(xiàn)方法

    Vue.js是一個輕巧、高性能、可組件化的MVVM庫,同時擁有非常容易上手的API。下面通過本文給大家介紹vue.js ajax動態(tài)參數(shù)與列表顯示實現(xiàn)方法,感興趣的朋友一起看看吧
    2016-10-10
  • Vue實現(xiàn)電子簽名功能的完整代碼

    Vue實現(xiàn)電子簽名功能的完整代碼

    本文介紹了在Vue項目中實現(xiàn)電子簽名功能的步驟,包括將原始文檔轉(zhuǎn)換為圖片、使用`signature_pad`和`html2canvas`庫、調(diào)整簽名位置和縮放比例、合并圖片等步驟,并提供了完整的源碼,需要的朋友可以參考下
    2025-02-02
  • vue vantUI實現(xiàn)文件(圖片、文檔、視頻、音頻)上傳(多文件)

    vue vantUI實現(xiàn)文件(圖片、文檔、視頻、音頻)上傳(多文件)

    這篇文章主要介紹了vue vantUI實現(xiàn)文件(圖片、文檔、視頻、音頻)上傳(多文件),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • 淺談vuepress 踩坑記

    淺談vuepress 踩坑記

    本篇文章主要介紹了淺談vuepress 踩坑記,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Vue組件之間的參數(shù)傳遞與方法調(diào)用的實例詳解

    Vue組件之間的參數(shù)傳遞與方法調(diào)用的實例詳解

    這篇文章主要介紹了Vue組件之間的參數(shù)傳遞與方法調(diào)用,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • Vue中非父子組件通信的方法小結

    Vue中非父子組件通信的方法小結

    在Vue.js中,組件間的通信是構建復雜應用的關鍵,但當涉及到非父子關系的組件通信時,傳統(tǒng)的做法就顯得力不從心了,本文將深入探討幾種有效的非父子組件通信方法,并通過具體的代碼示例來幫助讀者理解和應用這些技術,需要的朋友可以參考下
    2024-09-09
  • lottie實現(xiàn)vue自定義loading指令及常用指令封裝詳解

    lottie實現(xiàn)vue自定義loading指令及常用指令封裝詳解

    這篇文章主要為大家介紹了lottie實現(xiàn)vue自定義loading指令及常用指令封裝,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 解決vue刷新頁面以后丟失store的數(shù)據(jù)問題

    解決vue刷新頁面以后丟失store的數(shù)據(jù)問題

    這篇文章主要介紹了解決vue刷新頁面以后丟失store的數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vue3.0之引入Element-plus ui樣式的兩種方法

    Vue3.0之引入Element-plus ui樣式的兩種方法

    本文主要介紹了Vue3.0之引入Element-plus ui樣式的兩種方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論

会昌县| 象州县| 同德县| 海兴县| 苍山县| 临汾市| 白河县| 临沧市| 娱乐| 宕昌县| 钟祥市| 海安县| 合川市| 长宁区| 西乌珠穆沁旗| 玉龙| 靖边县| 桑植县| 双牌县| 米林县| 子洲县| 武功县| 楚雄市| 陈巴尔虎旗| 论坛| 彭水| 玛多县| 来宾市| 临安市| 永平县| 高唐县| 磐安县| 正定县| 安远县| 如皋市| 班戈县| 东港市| 吴忠市| 双牌县| 白水县| 普兰店市|