亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue使用三方工具vueUse實(shí)現(xiàn)虛擬列表

 更新時(shí)間:2024年04月19日 10:37:05   作者:吃肉不吃皮  
其實(shí)采用vueUse中的useVirtualList方法同樣可以實(shí)現(xiàn)虛擬列表,這篇文章小編就來(lái)和大家詳細(xì)介紹一下如何使用vueUse實(shí)現(xiàn)簡(jiǎn)單的虛擬列表效果吧

前言

書(shū)接上文,前篇文章介紹了如何手寫一個(gè)虛擬列表,這篇文章就介紹一下如何偷懶使用現(xiàn)有的三方工具實(shí)現(xiàn)

傳送門:如果讓你渲染十萬(wàn)條數(shù)據(jù),無(wú)腦全部渲染?拖出去斬了

vueUse方案實(shí)現(xiàn)

采用vueUse中的useVirtualList方法同樣可以實(shí)現(xiàn)虛擬列表(相當(dāng)于是使用一個(gè)封裝好的方法)

文檔鏈接

步驟:

1.裝包

npm i @vueuse/core

2.導(dǎo)入useVirtualList方法

如何使用?

在使用useVirtualList方法時(shí)需要傳入兩個(gè)參數(shù),一個(gè)是數(shù)據(jù)源(就是你那十萬(wàn)條數(shù)據(jù)),一個(gè)是配置項(xiàng)(配置每項(xiàng)的高度)

在配置項(xiàng)中配置的高度一定要和模板中渲染的每一項(xiàng)的高度相同(即配置項(xiàng)的高度要與css中的高度保持一致)

這個(gè)方法返回三個(gè)字段,一個(gè)處理后的數(shù)據(jù)源,兩個(gè)依賴項(xiàng),這兩個(gè)依賴項(xiàng)需要綁定到視圖區(qū)域和占位盒子身上,從而實(shí)現(xiàn)虛擬列表的效果

手動(dòng)添加類名,然后審查元素:

<template>
  <div v-bind="containerProps" style="height: 500px" class="container">
    <div v-bind="wrapperProps" class="slot">
      <div v-for="item in list" :key="item.data.id" style="height: 40px">
        Row: {{ item.data }}
      </div>
    </div>
  </div>
</template>

大致的效果就是虛擬列表的div包裹著占位的div,占位的div內(nèi)進(jìn)行渲染。當(dāng)然,樣式自己就根據(jù)需要添加即可

完整代碼

<script setup lang="ts">
import { useVirtualList } from '@vueuse/core'
import { onMounted, ref } from 'vue'
type Item = {
  id: number
  name: string
}

// 所有的數(shù)據(jù),比如這個(gè)數(shù)組存放了十萬(wàn)條數(shù)據(jù)
const allListData = ref<Item[]>([])
// 獲取十萬(wàn)條數(shù)據(jù)
const getData = () => {
  for (let i = 0; i < 10000; i++) {
    allListData.value.push({ name: `第${i}條數(shù)據(jù)`, id: i })
  }
}

onMounted(() => {
  getData()
})

const { list, containerProps, wrapperProps } = useVirtualList(allListData, {
  // 此處配置的高度一定要和31行渲染時(shí)每一行的高度相同
  itemHeight: 40
})
</script>

<template>
  <div v-bind="containerProps" style="height: 500px" class="container">
    <div v-bind="wrapperProps" class="slot">
      <div v-for="item in list" :key="item.data.id" style="height: 40px">
        Row: {{ item.data }}
      </div>
    </div>
  </div>
</template>
  
<style scoped lang="scss">
.container {
  border: 1px solid black;
}
</style>

同時(shí)注意,將原始數(shù)據(jù)源傳給useVirtualList之后返回的list是經(jīng)過(guò)封裝過(guò)的,想這里原本數(shù)據(jù)的每一項(xiàng)的結(jié)構(gòu)是{ name:'', id:xx },經(jīng)過(guò)處理后,再想訪問(wèn)name或者id,就得多訪問(wèn)一層data,即list.data.name / list.data.id

完整代碼

<script setup lang="ts">
import { onMounted, ref } from 'vue'
import { RecycleScroller } from 'vue-virtual-scroller'
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'

type Item = {
  id: number
  name: string
}

// 所有的數(shù)據(jù),比如這個(gè)數(shù)組存放了十萬(wàn)條數(shù)據(jù)
const allListData = ref<Item[]>([])
// 獲取十萬(wàn)條數(shù)據(jù)
const getData = () => {
  for (let i = 0; i < 10000; i++) {
    allListData.value.push({ name: `第${i}條數(shù)據(jù)`, id: i })
  }
}

onMounted(() => {
  getData()
})

// 每一項(xiàng)的高度,比如 40 像素
const itemHeight = ref(40)
</script>

<template>
  <RecycleScroller
    class="viewport"
    :items="allListData"
    :item-size="itemHeight"
    key-field="id"
    v-slot="{ item }"
    item-class="item"
  >
    {{ item.name }}
  </RecycleScroller>
</template>

<style scoped lang="scss">
.viewport {
  box-sizing: border-box;
  width: 240px;
  height: 400px;
  border: solid 1px #000000;
  // 開(kāi)啟滾動(dòng)條
  overflow-y: auto;

  <!-- 由于模板中使用了 item-class 屬性將渲染的每一項(xiàng)的類名改為 item,所以這里開(kāi)啟深層次的樣式修改-->
  :deep(.item) {
    box-sizing: border-box;
    width: 100%;
    height: 40px;		// 高度設(shè)置得和 item-size 屬性的值一致。表示每一項(xiàng)的高度
    display: flex;
    justify-content: center;
    align-items: center;
    // 隔行變色
    &:nth-child(even) {
      background: skyblue;
    }
    &:nth-child(odd) {
      background: red;
    }
  }
}
</style>

實(shí)現(xiàn)效果

審查一下元素:

其實(shí)可以發(fā)現(xiàn)底層實(shí)現(xiàn)原理和之前手寫的部分差不多,都是最外層一個(gè)虛擬列表盒子,內(nèi)層放置一個(gè)具有所有數(shù)據(jù)的高度的盒子,然后再設(shè)置一個(gè)視圖層進(jìn)行滾動(dòng)。但是使用封裝好的東西可以不用自己設(shè)置定位以及更新top值,而且其實(shí)它的文檔里還有其他很多的屬性和事件,拓展性強(qiáng)。還支持每一項(xiàng)的高度可以不同(可能在那種評(píng)論區(qū)用得多,畢竟每條評(píng)論的內(nèi)容不一定都相同)

報(bào)錯(cuò)問(wèn)題

由于使用的是 Vue3 + TS,所以在導(dǎo)入的時(shí)候會(huì)有類型報(bào)錯(cuò),雖然不影響功能

嘗試下載提示中的包文件,但是竟然顯示找不到了,可能是在@types中沒(méi)有這個(gè)包的聲明文件吧

到此這篇關(guān)于Vue使用三方工具vueUse實(shí)現(xiàn)虛擬列表的文章就介紹到這了,更多相關(guān)Vue vueUse虛擬列表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • el-table渲染慢卡頓問(wèn)題最優(yōu)解決方案

    el-table渲染慢卡頓問(wèn)題最優(yōu)解決方案

    本文主要介紹了el-table渲染慢卡頓問(wèn)題最優(yōu)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Vue?FileManagerPlugin?報(bào)錯(cuò)問(wèn)題及解決

    Vue?FileManagerPlugin?報(bào)錯(cuò)問(wèn)題及解決

    這篇文章主要介紹了Vue?FileManagerPlugin?報(bào)錯(cuò)問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Vue.js框架實(shí)現(xiàn)購(gòu)物車功能

    Vue.js框架實(shí)現(xiàn)購(gòu)物車功能

    這篇文章主要為大家詳細(xì)介紹了Vue.js框架實(shí)現(xiàn)購(gòu)物車功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • vuejs手把手教你寫一個(gè)完整的購(gòu)物車實(shí)例代碼

    vuejs手把手教你寫一個(gè)完整的購(gòu)物車實(shí)例代碼

    這篇文章主要介紹了vuejs-手把手教你寫一個(gè)完整的購(gòu)物車實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Vue單頁(yè)及多頁(yè)應(yīng)用全局配置404頁(yè)面實(shí)踐記錄

    Vue單頁(yè)及多頁(yè)應(yīng)用全局配置404頁(yè)面實(shí)踐記錄

    無(wú)論單頁(yè)還是多頁(yè),我的實(shí)現(xiàn)思路是總體配置404頁(yè)面的思路就是在前端路由表中添加一個(gè) path: '/404' 的路由,渲染相應(yīng)的404頁(yè)面。這篇文章主要介紹了Vue單頁(yè)及多頁(yè)應(yīng)用全局配置404頁(yè)面實(shí)踐,需要的朋友可以參考下
    2018-05-05
  • Vue內(nèi)置組件Teleport的使用

    Vue內(nèi)置組件Teleport的使用

    Teleport是一個(gè)內(nèi)置組件,它可以將一個(gè)組件內(nèi)部的一部分模板“傳送”到該組件的?DOM?結(jié)構(gòu)外層的位置去,本文就來(lái)介紹一下如何使用,感興趣的可以了解一下
    2023-05-05
  • vue2.0 datepicker使用方法

    vue2.0 datepicker使用方法

    這篇文章主要介紹了vue2.0 datepicker的使用方法,非常不錯(cuò),具有參考借鑒借鑒價(jià)值,需要的朋友參考下
    2018-02-02
  • Vue精簡(jiǎn)版風(fēng)格概述

    Vue精簡(jiǎn)版風(fēng)格概述

    本篇文章給大家講解了一下Vue精簡(jiǎn)版風(fēng)格的相關(guān)知識(shí)點(diǎn)內(nèi)容以及分享了實(shí)例代碼,有興趣的朋友參考下。
    2018-01-01
  • 使用Vue+ElementUI動(dòng)態(tài)生成面包屑導(dǎo)航教程

    使用Vue+ElementUI動(dòng)態(tài)生成面包屑導(dǎo)航教程

    Vue和ElementUI都是非常流行的前端開(kāi)發(fā)框架,它們可以讓我們更加便捷地開(kāi)發(fā)前端應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于使用Vue+ElementUI動(dòng)態(tài)生成面包屑導(dǎo)航的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • 在Vue中使用echarts的方法

    在Vue中使用echarts的方法

    這篇文章主要介紹了Vue中使用echarts的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02

最新評(píng)論