新闻中心
Vue Virtual Scroller 结合 VueUse 实现无限滚动

本文档旨在解决在使用 Vue Virtual Scroller 和 VueUse 的 useInfiniteScroll 函数时,遇到的无限滚动无法正常触发的问题。通过详细的代码示例和步骤说明,帮助开发者正确地将两者结合使用,实现高效的无限滚动列表。核心在于确保 ref 在组件挂载后正确绑定,并正确导出响应式引用。
在使用 Vue Virtual Scroller(vue-virtual-scroller)和 VueUse 的 useInfiniteScroll 函数时,可能会遇到无限滚动功能无法正常工作的问题。这通常是由于组件挂载时 ref 的绑定时机不正确导致的。本文将提供一种解决方案,确保 useInfiniteScroll 能够正确地绑定到 Virtual Scroller 的滚动元素上,从而实现无限滚动。
问题分析
在 Vue 组件的 setup 函数中,ref 的值在组件挂载之前是 null。这意味着,如果在组件挂载之前调用 useInfiniteScroll,它将无法正确地绑定到滚动元素上。
解决方案
为了解决这个问题,我们需要将 useInfiniteScroll 的调用延迟到组件挂载之后。可以使用 Vue 的 onMounted 生命周期钩子来实现这一点。
代码示例
秀脸FacePlay
一款集成AI换脸、照片跳舞等多种AI特效玩法的App
124
查看详情
以下是一个修改后的代码示例,展示了如何正确地使用 onMounted 来初始化 useInfiniteScroll:
import { ref, onMounted, d
efineComponent } from 'vue'
import { useInfiniteScroll } from '@vueuse/core'
export default defineComponent({
//...
setup(props) {
// ...
const scroller = ref<HTMLElement | null>(null) // 类型定义允许 null
const items = ref([]) // 示例数据
onMounted(() => {
useInfiniteScroll(
scroller,
() => {
// 模拟异步加载更多数据
return new Promise((resolve) => {
setTimeout(() => {
//getRelatedSolutions({
// skip: items.value.length,
// limit: USE_CASE_LIMIT,
// loadMore: true,
// isScrollTop: false,
// sortBy: sortBy.isAscending ? sortBy.key : `-${sortBy.key}`
//})
const newData = Array.from({ length: 10 }, (_, i) => ({ id: items.value.length + i, name: `Item ${items.value.length + i}` }));
items.value = [...items.value, ...newData];
resolve();
}, 500);
});
},
{
distance: 100 // 滚动到底部的距离触发加载更多
}
)
})
return {
//...
scroller, // 如果未使用 `<script setup>`,则必须返回 scroller
items
}
},
template: `
<div style="height: 200px; overflow-y: auto;" ref="scroller">
<div v-for="item in items" :key="item.id" style="height: 50px; border-bottom: 1px solid #ccc;">
{{ item.name }}
</div>
<div v-if="items.length === 0">Loading...</div>
</div>
`
})代码解释
- 引入 onMounted: 从 Vue 中引入 onMounted 生命周期钩子。
- 定义 scroller ref: 定义一个 ref 来引用滚动元素。
- onMounted 钩子: 在 onMounted 钩子中调用 useInfiniteScroll。这样可以确保在组件挂载之后,scroller ref 已经正确地绑定到滚动元素上。
- 返回 scroller: 如果没有使用
-
类型定义: 建议为 scroller ref 添加类型定义 ref
(null),允许初始值为 null,避免潜在的类型错误。
注意事项
- 如果使用
- 组件导出: 请确保你的组件正确地导出了。如果未使用
- 滚动容器样式: 确保滚动容器(在这个例子中是 DynamicScroller.e-solution-list__body 或示例代码中的 div)具有 overflow-y: auto 或 overflow-y: scroll 样式,以便启用滚动。
- 数据加载逻辑: 替换示例代码中的模拟数据加载逻辑为你的实际数据加载函数 getRelatedSolutions。
- 距离阈值: 根据你的需求调整 useInfiniteScroll 的 distance 选项,以控制何时触发加载更多数据的回调函数。
总结
通过将 useInfiniteScroll 的调用延迟到组件挂载之后,可以确保它能够正确地绑定到 Virtual Scroller 的滚动元素上,从而实现无限滚动功能。记住,正确的 ref 绑定和组件导出是关键。同时,确保滚动容器具有正确的样式,并且数据加载逻辑正确实现。
以上就是Vue Virtual Scroller 结合 VueUse 实现无限滚动的详细内容,更多请关注其它相关文章!
# 推荐使用
# 无锡seo网络优化招聘
# 网站制作优化多少钱一个
# 淮南官网seo如何选
# 嵊体推广营销团队排名
# 产品seo怎么优化推广
# AI网络seo
# 青浦区营销网站建设推荐
# 产品推广营销图怎么画
# 云浮seo网站优化方法
# 普陀区大型网站建设
# 中文网
# 相关文章
# vue
# 在这个
# 是一个
# 无法正常
# 回调
# 加载
# 正确地
# 绑定
# overflow
# 异步加载
# 回调函数
# v-if
# html
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖
Python大型XML文件高效流式解析教程
qq音乐在线播放入口_qq音乐电脑版登录链接
微信语音通话掉线如何解决 微信语音通话稳定优化方法
在Pyomo中实现基于变量的条件约束:Big-M方法详解
Lar*el Excel导入时生成自定义递增ID的策略与实践
zookeeper 都有哪些功能?
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
Golang如何使用net/url解析URL_Golang URL解析与处理方法
c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC
顺丰快递查单号物流信息 顺丰快递小程序查询入口
钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧
如何将HTML表格多行数据保存到Google Sheets
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
谷歌推RCS信息存档功能:公司可监控员工私密信息!
Win11网速慢怎么解决 Win11网络设置优化解除限速
漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道
J*a最大堆Heapify方法修复:索引计算与边界条件深度解析
Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置
在J*aScript中复现SciPy的B样条拟合与求值:关键考量
如何使用纯J*aScript判断Input元素是否在特定类容器内
如何仅使用CSS更改登录界面背景图像图标的颜色
如何使用Node.js csv 包按条件移除含空字段的CSV记录
MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具
学习通网页版官方登录 超星学习通电脑端入口指南
免费抖音短视频入口_抖音网页版短视频免费通道
绝地鸭卫平a核爆刀流玩法攻略
J*aScript数据结构转换:将对象数组按类别分组
印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】
c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发
ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接
天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】
支付宝如何设置安全保护_支付宝安全设置的全面教程
响应式容器内容自动缩放与宽高比维持教程
探索高级语言到原生C/C++的转译:挑战与内存管理策略
内存检查:在VS Code中调试C++时的内存视图
QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口
css链接悬停下划线样式如何自定义_使用::after结合content和transition
J*a递归快速排序中静态变量的状态管理与陷阱
优化大型XML文件解析:基于Python流式处理的内存高效方案
Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】
微信群消息显示延迟如何解决 微信群消息刷新优化方法
Angular中单选按钮的正确使用与常见陷阱解析
大麦的“候补”是什么意思 大麦候补购票规则【详解】
利用Bokeh CustomJS动态控制DataTable列可见性
CKEditor 5 自定义构建在React应用中渲染失败的调试与解决
必由学官方登录入口 必由学教师学生账号快速访问
蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗


2025-10-08
浏览次数:次
返回列表
efineComponent } from 'vue'
import { useInfiniteScroll } from '@vueuse/core'
export default defineComponent({
//...
setup(props) {
// ...
const scroller = ref<HTMLElement | null>(null) // 类型定义允许 null
const items = ref([]) // 示例数据
onMounted(() => {
useInfiniteScroll(
scroller,
() => {
// 模拟异步加载更多数据
return new Promise((resolve) => {
setTimeout(() => {
//getRelatedSolutions({
// skip: items.value.length,
// limit: USE_CASE_LIMIT,
// loadMore: true,
// isScrollTop: false,
// sortBy: sortBy.isAscending ? sortBy.key : `-${sortBy.key}`
//})
const newData = Array.from({ length: 10 }, (_, i) => ({ id: items.value.length + i, name: `Item ${items.value.length + i}` }));
items.value = [...items.value, ...newData];
resolve();
}, 500);
});
},
{
distance: 100 // 滚动到底部的距离触发加载更多
}
)
})
return {
//...
scroller, // 如果未使用 `<script setup>`,则必须返回 scroller
items
}
},
template: `
<div style="height: 200px; overflow-y: auto;" ref="scroller">
<div v-for="item in items" :key="item.id" style="height: 50px; border-bottom: 1px solid #ccc;">
{{ item.name }}
</div>
<div v-if="items.length === 0">Loading...</div>
</div>
`
})