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

vue長列表優(yōu)化之虛擬列表實現(xiàn)過程詳解

 更新時間:2022年08月26日 09:35:52   作者:_勻升  
前端的業(yè)務開發(fā)中會遇到不使用分頁方式來加載長列表的需求,下面這篇文章主要給大家介紹了關于vue長列表優(yōu)化之虛擬列表實現(xiàn)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

前言

應用場景:后臺一次性發(fā)送上千條或更多數(shù)據給前臺

場景模擬:用戶發(fā)起一個請求,后臺發(fā)送了10w條數(shù)據

使用虛擬列表之前:前臺需要生成10w個dom節(jié)點用來渲染頁面

使用虛擬列表之后:前臺只需要生成少量dom節(jié)點(dom節(jié)點數(shù)量取決于前端視圖需要展示的數(shù)量),就可以實現(xiàn)對這10w條數(shù)據的視圖渲染

總之:虛擬列表就是固定dom節(jié)點數(shù)量,通過修改dom節(jié)點的內容而達到不重新增加(或刪除)dom節(jié)點來實現(xiàn)列表的更新

實現(xiàn)原理

  • 監(jiān)聽頁面滾動,獲取滾動的高度scrolltop
  • 根據scrolltop,可以知道當前應該展示哪一段數(shù)據(即獲取要展示數(shù)據的index)
  • 根據當前展示的數(shù)據在長列表中的index,對列表進行偏移

實現(xiàn)思路是這樣的:

設置列表初始值

  1. 需要展示給用戶的數(shù)量showNum
  2. 列表item的高度itemHeight
  3. 需要展示的第一條數(shù)據的下標start
  4. 需要展示的最后一條數(shù)據的下標end
  5. 通過start和end已經showNum,我們可以得到需要展示的列表項showList,我們可以通過vue的計算屬性來實時獲取新的showList

建立列表視圖模型

  • 給列表視圖設置高度ListWrapHeight
  • 根據itemHeightshowNum,我們可以得到列表總高度ListHeight,我們必須要使得ListHeight高度大于ListWrapHeight,這樣才能實現(xiàn)滾動

監(jiān)聽頁面滾動

  • 給列表視圖模型設置監(jiān)聽函數(shù),每當列表視圖發(fā)生滾動,就執(zhí)行回調,獲取滾動高度scrolltop
  • 通過scrolltop和itemHeight我們可以得到新的start以及end,從而獲取到新的showList
  • 通過start和itemHeight我們可以給list設置偏移(translate),從而達到讓start對應的數(shù)據展示在視圖模型的效果

注意:列表視圖模型和列表并不是一個東西,視圖模型表示者頁面供列表展示的一塊區(qū)域,而列表表示的是需要展示的列表項總高度

這是列表視圖模型

image-20220530183845436

這是列表

image-20220530183906181

列表中超出視圖模型的節(jié)點就被隱藏了

為什么限制了展示列表項的長度(限制了dom數(shù)量),視圖模型還能持續(xù)滾動?

給列表設置translate會增大列表的高度,既然list的高度變大了,那么視圖模型就可以繼續(xù)滾動

實現(xiàn)代碼

? 以vue3為例(不管是vue2或是vue3,實現(xiàn)虛擬列表的核心代碼都是相同的,即監(jiān)聽滾動,賦新值)

<div ref="listWrap" class="list-wrap" @scroll="scrollListener">
    <div class="list" ref="List">
        <slot  v-for="item in showList" :songInfo="item" :key="item.id"></slot>
    </div>
  </div>
  setup(props) {
    const list = ref(props.list); //長列表數(shù)據
    const itemHeight = ref(props.itemHeight); //item高度
    const showNum = ref(props.showNum); //展示的數(shù)據
    const start = ref(props.start); //滾動過程中的開始索引
    const end = ref(props.end); //滾動過程中的結束索引
    const listWrap = ref(null); //獲取列表視圖模型節(jié)點
    const List = ref(null)//獲取列表節(jié)點
    onMounted(() => {
        listWrap.value.style.height = itemHeight.value * showNum.value + "px";//設置列表視圖模型的高度
    });
    const showList = computed(() => {
      //獲取展示的列表
      return list.value.slice(start.value, end.value);
    });

    const scrollListener = (() => {
           //獲取滾動高度
            let scrollTop = listWrap.value.scrollTop;
            //開始的數(shù)組索引
            start.value = Math.floor(scrollTop / itemHeight.value);
            //結束索引
            end.value = start.value + showNum.value;
            List.value.style.transform =  `translateY(${start.value * itemHeight.value}px)`//對列表項進行偏移
    })
    return {
      ...
    };
  },

效果:

GIF 2022-5-30 18-45-24

節(jié)點變化

可以看到不論列表如何變化,列表dom的數(shù)量并沒有新增

GIF 2022-5-30 18-47-14

總結 

到此這篇關于vue長列表優(yōu)化之虛擬列表實現(xiàn)的文章就介紹到這了,更多相關vue虛擬列表實現(xiàn)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

青龙| 博湖县| 新晃| 保靖县| 拉萨市| 邯郸市| 富阳市| 宜宾市| 巫溪县| 五家渠市| 封开县| 搜索| 康马县| 宜川县| 德兴市| 井研县| 定远县| 北流市| 保山市| 汉川市| 宜兰县| 大邑县| 温泉县| 文昌市| 循化| 庆城县| 彰化县| 手游| 台北县| 威宁| 淄博市| 德保县| 南江县| 邢台市| 二手房| 铜梁县| 壶关县| 英山县| 汕头市| 斗六市| 博白县|