虚拟列表-渲染 10 万条数据
1.H5 的新特性有哪些?C3 的新特性有哪些2.Localstorage、sessionStorage、cookie 的区别3.H5 的浏览器存储有哪些4.简述 transform,transition,animation 的作用?5.CSS 中选择器的优先级以及CSS 权重如何计算6.HTML5 的离线存储怎么使用,工作原理是什么?7.css3制作三角形8.rem 适配方法如何计算 HTML 跟字号及适配方案?9.定位相关10.Modele build failed: TypeError: this.getResolve is not a function at Object.loader...11.BFC 是什么12.使用CSS怎么让Chrome支持小于12px的文字比如10px13.创建对象有几种方法14.JavaScript中的toLocaleString()方法你知道吗?15.暂时性死区16.作用域链和原型链17.dom 节点的 Attribute 和 Property 有何区别?18.简单说一下页面重绘和回流?19.defer 属性async 属性20.解释一下什么是回调函数,并提供一个简单的例子21.你对原型(prototype)理解22.简单说说 js 中的继承23.介绍 this 各种情况24.for in 和 for of 的区别25.判断一个字符串中出现次数最多的字符,统计这个次数26.jQuery 的 ajax 返回的是 promise 对象吗?27.echarts切换其他组件统计图时,出现卡顿问题如何解决28.module、export、import 有什么作用29.包含Symbol类型的对象遍历取key使用Reflect.ownKeys30.常见的 HTTP 状态码以及代表的意义31.HTTP 与 HTTPS 的区别32.一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么33.浏览器如何加载页面的,script 脚本阻塞有什么解决办法,defer 和 async 的区别是什么34.Vue 数据双向绑定的原理是什么?35.组件中写 name 选项有什么作用36.怎么在组件中监听路由参数的变化?37.怎么捕获 Vue 组件的错误信息?38.computed 中的属性名和 data 中的属性名可以相同吗39.Vue 中 key 值的作用是什么?40.你对 Vue.js 的 template 编译的理解?41.VNode 是什么?什么是虚拟DOM?42.简述下 wx.navigateTo(), wx.redirectTo(), wx.switchTab(),wx.navigateBack(), wx.reLaunch()的区别?43.微信小程序长按识别二维码44.原生微信小程序45.小程序中 canvas 的图片不支持 base64 格式46.小程序关联微信公众号如何确定用户的唯一性?47.setState和useState执行48.如何进行前端性能优化49.Vue和React中diff算法区别50.通过code换取网页授权access_token和基础支持中的access_token有以下不同之处:51.H5调起支付API52.使用Vue前端实现微信授权、微信支付和支付宝支付的具体代码和流程。53.js中显示转换类型54.js小常识55.js获取浏览器地址的query参数并以键值对的方式展示(对象)封装一个方法56.js寄生组合式继承57.ts58.promise知识159.vue中v-bind和v-model的区别是什么60.Vue中key的作用61.在Vue 3中,与Vue 2相比,有一些改进和优化的diff算法。62.浏览器解析html63.浏览器渲染HTML64.Object.entries()65.vue实现虚拟dom转换成真是dom的原理66.为什么vue数组下标修改监听不到67.Vue 3 在某些场景下可能表现出比 Vue 2 更低的性能68.vue里表单验证的v-model.number的坑69.开启严格模式70.js手写一个call71.js手写一个apply72. 手写一个 bind 方法73.js寄生组合式继承74.react中的useState修改状态获取最新状态值75.函数柯里化js76.axios请求中断_下载中断和下载进度77.axios请求重试_核心原理78.axios请求重试_axios-retry插件
79.虚拟列表-渲染 10 万条数据
80.vue-office 组件81.threejs82.把原生 DOM 标签转换后加入到 3D 场景空间中显示83.three.js 物体要使用光线投射技术,计算是否点击位置与物体有交叉84.threejs基本函数85.二分查找算法86.js判断字符串是否连贯87.世界坐标系和模型坐标系88.设置车模型中每个小物体 castShadow = true89.Vue3 echarts 组件化使用 resizeObserver90.网页验证码的作用 *网页中几种常见验证码91.多个装饰器一起es6装饰器92.flex属性93.移动端兼容问题94.那什么是URL、URI、URN?95.面试题96.面试前端简介
虚拟列表是一种优化长列表渲染的技术,它可以在保持流畅性的同时,渲染大量的数据。
在传统的列表渲染中,如果列表非常长,会导致渲染时间过长,页面卡顿,用户体验变得非常差。而虚拟列表则是只渲染可见区域内的数据,而非全部渲染,这样就可以大大提高渲染效率,保持页面流畅性。
应用场景
虚拟列表技术在大数据量列表渲染场景中应用广泛,例如电商商品列表、社交动态列表等。
虚拟列表实现原理
<script setup lang="ts">
import axios from 'axios'
import { computed, onMounted, ref } from 'vue'
type Item = {
id: number
name: string
}
// 所有的数据,比如这个数组存放了十万条数据
const allListData = ref<Item[]>([])
const itemHeight = ref(40) // 每一条(项)的高度,比如 40 像素
const count = ref(10) // 一屏展示几条数据
const startIndex = ref(0) // 开始位置的索引
const endIndex = ref(10) // 结束位置的索引
const topVal = ref(0) // 父元素滚动位置
// 计算展示的列表
const showListData = computed(() => allListData.value.slice(startIndex.value, endIndex.value))
// 获取十万条数据
const getData = async () => {
const res = await axios.get('http://localhost:3000/large-data')
allListData.value = res.data.data
}
// 初始化加载
onMounted(() => {
getData()
})
// 虚拟列表视口
const viewport = ref<HTMLDivElement>()
// 滚动这里可以加上节流,减少触发频次
const handleScroll = () => {
// 非空判断
if (!viewport.value) return
// 获取滚动距离
const scrollTop = viewport.value.scrollTop
// 计算起始下标和结束下标,用于 computed 计算
startIndex.value = Math.floor(scrollTop / itemHeight.value)
endIndex.value = startIndex.value + count.value
// 动态更改定位的 top 值,确保联动,动态展示相应内容
topVal.value = viewport.value.scrollTop
}
</script>
<template>
<h2>手写虚拟列表-原理{{ topVal }}</h2>
<!--
虚拟列表容器:类似“视口”,视口的高度取决于一次展示几条数据
比如视口只能看到10条数据,一条40像素,10条400像素
故,视口的高度为400像素,注意要开定位和滚动条
-->
<div
class="viewport"
ref="viewport"
@scroll="handleScroll"
:style="{ height: itemHeight * count + 'px' }"
>
<!-- 占位 dom 元素,其高度为所有的数据的总高度 -->
<div class="placeholder" :style="{ height: allListData.length * itemHeight + 'px' }"></div>
<!-- 内容区,展示10条数据,注意其定位的top值是变化的 -->
<div class="list" :style="{ top: topVal + 'px' }">
<!-- 每一条(项)数据 -->
<div
v-for="item in showListData"
:key="item.id"
class="item"
:style="{ height: itemHeight + 'px' }"
>
{{ item.name }}
</div>
</div>
</div>
</template>
<style scoped lang="scss">
// 虚拟列表容器盒子
.viewport {
box-sizing: border-box;
width: 240px;
border: solid 1px #000000;
// 开启滚动条
overflow-y: auto;
// 开启相对定位
position: relative;
.list {
width: 100%;
height: auto;
// 搭配使用绝对定位
position: absolute;
top: 0;
left: 0;
.item {
box-sizing: border-box;
width: 100%;
height: 40px;
line-height: 40px;
text-align: center;
// 隔行变色
&:nth-child(even) {
background: #c7edcc;
}
&:nth-child(odd) {
background: pink;
}
}
}
}
</style>
VueUse 方案
pnpm install @vueuse/core
<script setup lang="ts">
import { useVirtualList } from '@vueuse/core'
import axios from 'axios'
import { onMounted, ref } from 'vue'
type Item = {
id: number
name: string
}
// 所有的数据,比如这个数组存放了十万条数据
const allListData = ref<Item[]>([])
// 获取十万条数据
const getData = async () => {
const res = await axios.get('http://localhost:3000/large-data')
allListData.value = res.data.data
}
// 初始化加载
onMounted(() => {
getData()
})
// 每一项的高度,比如 40 像素
const itemHeight = ref(40)
// vueuse方案:https://vueuse.org/core/useVirtualList/
const { list, containerProps, wrapperProps } = useVirtualList(allListData, {
itemHeight: itemHeight.value,
})
</script>
<template>
<h2>虚拟列表-VueUse实现</h2>
<div v-bind="containerProps" class="viewport">
<div v-bind="wrapperProps" class="list">
<div v-for="item in list" :key="item.data.id" class="item">
{{ item.data.name }}
</div>
</div>
</div>
</template>
<style scoped lang="scss">
// 虚拟列表容器盒子
.viewport {
box-sizing: border-box;
width: 240px;
height: 400px;
border: solid 1px #000000;
// 开启滚动条
overflow-y: auto;
// 开启相对定位
position: relative;
.list {
width: 100%;
height: auto;
// 搭配使用绝对定位
position: absolute;
top: 0;
left: 0;
.item {
box-sizing: border-box;
width: 100%;
height: 40px;
display: flex;
justify-content: center;
align-items: center;
// 隔行变色
&:nth-child(even) {
background: #c7edcc;
}
&:nth-child(odd) {
background: pink;
}
}
}
}
</style>
vue-virtual-scroller 方案
pnpm install vue-virtual-scroller@next
<script setup lang="ts">
import axios from 'axios'
import { onMounted, ref } from 'vue'
// https://github.com/Akryum/vue-virtual-scroller
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 = async () => {
const res = await axios.get('http://localhost:3000/large-data')
allListData.value = res.data.data
}
// 初始化加载
onMounted(() => {
getData()
})
// 每一项的高度,比如 40 像素
const itemHeight = ref(40)
</script>
<template>
<h2>虚拟列表-vue-virtual-scroller实现</h2>
<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;
// 开启相对定位
position: relative;
:deep(.item) {
box-sizing: border-box;
width: 100%;
height: 40px;
display: flex;
justify-content: center;
align-items: center;
// 隔行变色
&:nth-child(even) {
background: #c7edcc;
}
&:nth-child(odd) {
background: pink;
}
}
}
</style>
本文来自博客园,作者:jialiangzai,转载请注明原文链接:https://www.cnblogs.com/zsnhweb/articles/17779619.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!