vue实现无限滚轮
Vue实现无限滚动的常见方法
无限滚动(Infinite Scroll)是一种常见的前端交互模式,适用于长列表数据的加载。以下是几种Vue实现无限滚动的典型方案:

使用Intersection Observer API
Intersection Observer API是现代浏览器提供的性能友好的方法,可检测元素是否进入视口。

<template>
<div>
<div v-for="item in items" :key="item.id">{{ item.content }}</div>
<div ref="loader" class="loader">Loading...</div>
</div>
</template>
<script>
export default {
data() {
return {
items: [],
page: 1
}
},
mounted() {
const observer = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting) {
this.loadMore()
}
})
observer.observe(this.$refs.loader)
},
methods: {
async loadMore() {
const newItems = await fetchData(this.page++)
this.items.push(...newItems)
}
}
}
</script>
使用滚动事件监听
传统方法通过监听滚动事件计算滚动位置,需注意节流处理。
<template>
<div @scroll="handleScroll" ref="scrollContainer">
<!-- 列表内容 -->
</div>
</template>
<script>
export default {
methods: {
handleScroll() {
const { scrollTop, clientHeight, scrollHeight } = this.$refs.scrollContainer
if (scrollHeight - (scrollTop + clientHeight) < 50) {
this.loadMore()
}
},
loadMore() {
// 数据加载逻辑
}
}
}
</script>
使用第三方库
常用库如vue-infinite-loading提供开箱即用的解决方案:
<template>
<div>
<div v-for="item in items" :key="item.id">{{ item.content }}</div>
<infinite-loading @infinite="loadMore"></infinite-loading>
</div>
</template>
<script>
import InfiniteLoading from 'vue-infinite-loading'
export default {
components: { InfiniteLoading },
methods: {
loadMore($state) {
fetchData().then(newItems => {
this.items.push(...newItems)
$state.loaded()
})
}
}
}
</script>
性能优化建议
- 对动态加载的内容使用
<keep-alive>缓存组件 - 实现虚拟滚动(如
vue-virtual-scroller)处理超大列表 - 添加防抖/节流避免频繁触发加载
- 提供加载状态提示和错误处理机制
注意事项
- 移动端需考虑触屏滚动特性
- 分页参数需要与服务端API对齐
- 清除旧数据时重置分页状态
- 在组件销毁前移除事件监听器






