Vue使用三方工具vueUse实现虚拟列表

 更新时间:2024年04月19日 10:37:05   作者:吃肉不吃皮  
其实采用vueUse中的useVirtualList方法同样可以实现虚拟列表,这篇文章小编就来和大家详细介绍一下如何使用vueUse实现简单的虚拟列表效果吧

前言

书接上文,前篇文章介绍了如何手写一个虚拟列表,这篇文章就介绍一下如何偷懒使用现有的三方工具实现

传送门:如果让你渲染十万条数据,无脑全部渲染?拖出去斩了

vueUse方案实现

采用vueUse中的useVirtualList方法同样可以实现虚拟列表(相当于是使用一个封装好的方法)

文档链接

步骤:

1.装包

npm i @vueuse/core

2.导入useVirtualList方法

如何使用?

在使用useVirtualList方法时需要传入两个参数,一个是数据源(就是你那十万条数据),一个是配置项(配置每项的高度)

在配置项中配置的高度一定要和模板中渲染的每一项的高度相同(即配置项的高度要与css中的高度保持一致)

这个方法返回三个字段,一个处理后的数据源,两个依赖项,这两个依赖项需要绑定到视图区域和占位盒子身上,从而实现虚拟列表的效果

手动添加类名,然后审查元素:

<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内进行渲染。当然,样式自己就根据需要添加即可

完整代码

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

// 所有的数据,比如这个数组存放了十万条数据
const allListData = ref<Item[]>([])
// 获取十万条数据
const getData = () => {
  for (let i = 0; i < 10000; i++) {
    allListData.value.push({ name: `第${i}条数据`, id: i })
  }
}

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

const { list, containerProps, wrapperProps } = useVirtualList(allListData, {
  // 此处配置的高度一定要和31行渲染时每一行的高度相同
  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>

同时注意,将原始数据源传给useVirtualList之后返回的list是经过封装过的,想这里原本数据的每一项的结构是{ name:'', id:xx },经过处理后,再想访问name或者id,就得多访问一层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
}

// 所有的数据,比如这个数组存放了十万条数据
const allListData = ref<Item[]>([])
// 获取十万条数据
const getData = () => {
  for (let i = 0; i < 10000; i++) {
    allListData.value.push({ name: `第${i}条数据`, id: i })
  }
}

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

// 每一项的高度,比如 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;
  // 开启滚动条
  overflow-y: auto;

  <!-- 由于模板中使用了 item-class 属性将渲染的每一项的类名改为 item,所以这里开启深层次的样式修改-->
  :deep(.item) {
    box-sizing: border-box;
    width: 100%;
    height: 40px;		// 高度设置得和 item-size 属性的值一致。表示每一项的高度
    display: flex;
    justify-content: center;
    align-items: center;
    // 隔行变色
    &:nth-child(even) {
      background: skyblue;
    }
    &:nth-child(odd) {
      background: red;
    }
  }
}
</style>

实现效果

审查一下元素:

其实可以发现底层实现原理和之前手写的部分差不多,都是最外层一个虚拟列表盒子,内层放置一个具有所有数据的高度的盒子,然后再设置一个视图层进行滚动。但是使用封装好的东西可以不用自己设置定位以及更新top值,而且其实它的文档里还有其他很多的属性和事件,拓展性强。还支持每一项的高度可以不同(可能在那种评论区用得多,毕竟每条评论的内容不一定都相同)

报错问题

由于使用的是 Vue3 + TS,所以在导入的时候会有类型报错,虽然不影响功能

尝试下载提示中的包文件,但是竟然显示找不到了,可能是在@types中没有这个包的声明文件吧

到此这篇关于Vue使用三方工具vueUse实现虚拟列表的文章就介绍到这了,更多相关Vue vueUse虚拟列表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程

    在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程

    这篇文章主要介绍了在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程,需要的朋友可以参考下
    2018-03-03
  • Vue3防重复点击指令clickOnce使用方法

    Vue3防重复点击指令clickOnce使用方法

    使用Vue 框架开发项目中,遇到个问题,就是在用户提交数据时,如果连续多次点击按钮,会触发多次,导致数据异常,这篇文章主要介绍了Vue3防重复点击指令clickOnce使用的相关资料,需要的朋友可以参考下
    2026-03-03
  • vue Element-ui表格实现树形结构表格

    vue Element-ui表格实现树形结构表格

    这篇文章主要为大家详细介绍了vue Element-ui表格实现树形结构表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • vue中proxy代理的用法(解决跨域问题)

    vue中proxy代理的用法(解决跨域问题)

    这篇文章主要介绍了vue中的proxy代理的用法(解决跨域问题),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • vue离开当前页面触发的函数代码

    vue离开当前页面触发的函数代码

    这篇文章主要介绍了vue离开当前页面触发的函数代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • vue、react等单页面项目应该这样子部署到服务器

    vue、react等单页面项目应该这样子部署到服务器

    这篇文章主要介绍了vue、react等单页面项目应该这样子部署到服务器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Vue 技巧之控制父类的 slot

    Vue 技巧之控制父类的 slot

    插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性。
    2020-02-02
  • vue中this.$refs有值,但无法获取ref的值问题及解决

    vue中this.$refs有值,但无法获取ref的值问题及解决

    这篇文章主要介绍了vue中this.$refs有值,但无法获取ref的值问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 深入讲解Vue中数据代理的工作原理与实际应用

    深入讲解Vue中数据代理的工作原理与实际应用

    在学习 Vue 框架的过程中,数据代理(Data Proxy) 是一个非常核心且重要的概念,本文将结合代码示例和调试截图,深入讲解 Vue 中数据代理的工作原理与实际应用,希望对大家有所帮助
    2026-01-01
  • VUE项目中封装Echart折线图的方法

    VUE项目中封装Echart折线图的方法

    这篇文章主要为大家详细介绍了VUE项目中封装Echart折线图的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论