vue实现加载更多
Vue 实现加载更多功能
在 Vue 中实现加载更多功能通常涉及监听滚动事件或点击按钮触发加载更多数据。以下是几种常见的实现方式:
滚动监听实现无限滚动
通过监听滚动事件,当用户滚动到页面底部时自动加载更多数据。
<template>
<div>
<div v-for="item in items" :key="item.id">{{ item.content }}</div>
<div v-if="loading">加载中...</div>
</div>
</template>
<script>
export default {
data() {
return {
items: [],
page: 1,
loading: false,
hasMore: true
}
},
mounted() {
this.loadItems()
window.addEventListener('scroll', this.handleScroll)
},
beforeDestroy() {
window.removeEventListener('scroll', this.handleScroll)
},
methods: {
async loadItems() {
if (this.loading || !this.hasMore) return
this.loading = true
try {
const newItems = await this.fetchData(this.page)
if (newItems.length === 0) {
this.hasMore = false
} else {
this.items = [...this.items, ...newItems]
this.page++
}
} finally {
this.loading = false
}
},
handleScroll() {
const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
const windowHeight = window.innerHeight
const scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight
if (scrollTop + windowHeight >= scrollHeight - 100 && this.hasMore) {
this.loadItems()
}
},
fetchData(page) {
// 替换为实际的API调用
return new Promise(resolve => {
setTimeout(() => {
resolve(Array(10).fill(0).map((_, i) => ({
id: page * 10 + i,
content: `项目 ${page * 10 + i}`
})))
}, 500)
})
}
}
}
</script>
按钮触发加载更多
通过点击按钮手动触发加载更多数据。
<template>
<div>
<div v-for="item in items" :key="item.id">{{ item.content }}</div>
<button
v-if="hasMore"
@click="loadMore"
:disabled="loading"
>
{{ loading ? '加载中...' : '加载更多' }}
</button>
<div v-else>没有更多数据了</div>
</div>
</template>
<script>
export default {
data() {
return {
items: [],
page: 1,
loading: false,
hasMore: true
}
},
mounted() {
this.loadItems()
},
methods: {
async loadItems() {
this.loading = true
try {
const newItems = await this.fetchData(this.page)
if (newItems.length === 0) {
this.hasMore = false
} else {
this.items = [...this.items, ...newItems]
this.page++
}
} finally {
this.loading = false
}
},
loadMore() {
this.loadItems()
},
fetchData(page) {
// 替换为实际的API调用
return new Promise(resolve => {
setTimeout(() => {
resolve(Array(10).fill(0).map((_, i) => ({
id: page * 10 + i,
content: `项目 ${page * 10 + i}`
})))
}, 500)
})
}
}
}
</script>
使用第三方库
可以使用现成的Vue无限滚动库,如vue-infinite-loading:
-
安装库:
npm install vue-infinite-loading -
使用示例:
<template> <div> <div v-for="item in items" :key="item.id">{{ item.content }}</div> <infinite-loading @infinite="loadMore" spinner="spiral"> <div slot="no-more">没有更多数据了</div> <div slot="no-results">没有数据</div> </infinite-loading> </div> </template>
export default { components: { InfiniteLoading }, data() { return { items: [], page: 1 } }, methods: { async loadMore($state) { try { const newItems = await this.fetchData(this.page) if (newItems.length) { this.items = [...this.items, ...newItems] this.page++ $state.loaded() } else { $state.complete() } } catch (error) { $state.error() } }, fetchData(page) { // 替换为实际的API调用 return new Promise(resolve => { setTimeout(() => { resolve(Array(10).fill(0).map((_, i) => ({ id: page 10 + i, content: `项目 ${page 10 + i}` }))) }, 500) }) } } }
```性能优化建议
- 使用虚拟滚动处理大量数据,可以考虑
vue-virtual-scroller库 - 添加防抖处理滚动事件,避免频繁触发
- 在组件销毁时移除事件监听
- 考虑添加错误处理和重试机制
- 对于移动端,可以优化触底检测的阈值
以上方法可以根据具体需求选择适合的实现方式,滚动监听适合无限滚动场景,按钮触发则给予用户更多控制权。







