值得一看
广告
彩虹云商城
广告

热门广告位

Vue Virtual Scroller 结合 VueUse 实现无限滚动

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 生命周期钩子来实现这一点。

代码示例

无涯·问知

无涯·问知

无涯·问知,是一款基于星环大模型底座,结合个人知识库、企业知识库、法律法规、财经等多种知识源的企业级垂直领域问答产品

无涯·问知40

查看详情
无涯·问知

以下是一个修改后的代码示例,展示了如何正确地使用 onMounted 来初始化 useInfiniteScroll:

import { ref, onMounted, defineComponent } 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 ref="scroller">
<div v-for="item in items" :key="item.id">
{{ item.name }}
</div>
<div v-if="items.length === 0">Loading...</div>
</div>
`
})

代码解释

  1. 引入 onMounted: 从 Vue 中引入 onMounted 生命周期钩子。
  2. 定义 scroller ref: 定义一个 ref 来引用滚动元素。
  3. onMounted 钩子: 在 onMounted 钩子中调用 useInfiniteScroll。这样可以确保在组件挂载之后,scroller ref 已经正确地绑定到滚动元素上。
  4. 返回 scroller: 如果没有使用 <script setup>,确保从 setup 函数中返回 scroller ref,以便在模板中使用。
  5. 类型定义: 建议为 scroller ref 添加类型定义 ref<HTMLElement | null>(null),允许初始值为 null,避免潜在的类型错误。

注意事项

  • <script setup>: 如果使用 <script setup>,则无需显式返回 scroller,因为所有顶层绑定的变量都会自动暴露给模板。
  • 组件导出: 请确保你的组件正确地导出了。如果未使用 <script setup>,则需要使用 export default { /* code here */ } 或 export default defineComponent({ /* code here */ }) 来包装 setup 函数。推荐使用 defineComponent,因为它提供了更好的类型支持。
  • 滚动容器样式: 确保滚动容器(在这个例子中是 DynamicScroller.e-solution-list__body 或示例代码中的 div)具有 overflow-y: auto 或 overflow-y: scroll 样式,以便启用滚动。
  • 数据加载逻辑: 替换示例代码中的模拟数据加载逻辑为你的实际数据加载函数 getRelatedSolutions。
  • 距离阈值: 根据你的需求调整 useInfiniteScroll 的 distance 选项,以控制何时触发加载更多数据的回调函数。

总结

通过将 useInfiniteScroll 的调用延迟到组件挂载之后,可以确保它能够正确地绑定到 Virtual Scroller 的滚动元素上,从而实现无限滚动功能。记住,正确的 ref 绑定和组件导出是关键。同时,确保滚动容器具有正确的样式,并且数据加载逻辑正确实现。

相关标签:

vue html v-if 回调函数 异步加载 overflow NULL auto 回调函数 default overflow
温馨提示: 本文最后更新于2025-10-08 10:40:43,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞10赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容