vue实现分页加载
Vue 分页加载的实现方法
基础分页实现(后端分页)
安装依赖(如使用axios):
npm install axios
示例代码:

<template>
<div>
<ul>
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
<button @click="prevPage" :disabled="currentPage === 1">上一页</button>
<span>当前页:{{ currentPage }}</span>
<button @click="nextPage" :disabled="currentPage === totalPages">下一页</button>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
items: [],
currentPage: 1,
pageSize: 10,
totalItems: 0
};
},
computed: {
totalPages() {
return Math.ceil(this.totalItems / this.pageSize);
}
},
methods: {
fetchData() {
axios.get(`/api/items?page=${this.currentPage}&size=${this.pageSize}`)
.then(response => {
this.items = response.data.items;
this.totalItems = response.data.total;
});
},
nextPage() {
this.currentPage++;
this.fetchData();
},
prevPage() {
this.currentPage--;
this.fetchData();
}
},
created() {
this.fetchData();
}
};
</script>
无限滚动分页(前端分页)
示例代码:

<template>
<div class="scroll-container" @scroll="handleScroll">
<div v-for="item in visibleItems" :key="item.id">
{{ item.name }}
</div>
<div v-if="loading">加载中...</div>
</div>
</template>
<script>
export default {
data() {
return {
allItems: [],
visibleItems: [],
currentIndex: 0,
chunkSize: 20,
loading: false
};
},
methods: {
loadMore() {
this.loading = true;
// 模拟异步加载
setTimeout(() => {
const newItems = this.allItems.slice(
this.currentIndex,
this.currentIndex + this.chunkSize
);
this.visibleItems = [...this.visibleItems, ...newItems];
this.currentIndex += this.chunkSize;
this.loading = false;
}, 500);
},
handleScroll(event) {
const container = event.target;
const scrollBottom = container.scrollHeight - container.scrollTop - container.clientHeight;
if (scrollBottom < 50 && !this.loading) {
this.loadMore();
}
}
},
created() {
// 模拟数据
for (let i = 0; i < 1000; i++) {
this.allItems.push({ id: i, name: `项目 ${i}` });
}
this.loadMore();
}
};
</script>
<style>
.scroll-container {
height: 500px;
overflow-y: auto;
}
</style>
使用第三方库(如vue-infinite-loading)
安装:
npm install vue-infinite-loading
示例代码:
<template>
<div>
<ul>
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
<InfiniteLoading @infinite="loadMore" />
</div>
</template>
<script>
import InfiniteLoading from 'vue-infinite-loading';
import axios from 'axios';
export default {
components: { InfiniteLoading },
data() {
return {
items: [],
page: 1,
hasMore: true
};
},
methods: {
loadMore($state) {
axios.get(`/api/items?page=${this.page}`)
.then(({ data }) => {
if (data.items.length) {
this.items.push(...data.items);
this.page++;
$state.loaded();
} else {
this.hasMore = false;
$state.complete();
}
});
}
}
};
</script>
性能优化建议
- 使用虚拟滚动技术处理大量数据(如vue-virtual-scroller)
- 添加防抖机制避免频繁触发滚动事件
- 实现缓存机制减少重复请求
- 使用骨架屏提升用户体验
- 考虑使用Web Worker处理大数据计算
注意事项
- 分页参数需要与后端API保持一致
- 移动端需要考虑触屏滚动体验
- 加载状态需要明确反馈给用户
- 错误处理机制必不可少
- 分页器样式可根据项目需求自定义






