vue实现分页加载
实现分页加载的基本思路
Vue中实现分页加载通常结合前端分页和后端分页两种方式。前端分页适用于数据量较小的情况,后端分页适用于大数据量场景,通过API接口按需请求数据。
前端分页实现方法
安装依赖(如需要):
npm install vue-paginate
模板部分示例:
<template>
<div>
<ul>
<li v-for="item in paginatedItems" :key="item.id">{{ item.name }}</li>
</ul>
<button @click="prevPage" :disabled="currentPage === 1">上一页</button>
<span>{{ currentPage }} / {{ totalPages }}</span>
<button @click="nextPage" :disabled="currentPage === totalPages">下一页</button>
</div>
</template>
脚本部分:
export default {
data() {
return {
allItems: [], // 所有数据
currentPage: 1,
itemsPerPage: 10
}
},
computed: {
totalPages() {
return Math.ceil(this.allItems.length / this.itemsPerPage)
},
paginatedItems() {
const start = (this.currentPage - 1) * this.itemsPerPage
const end = start + this.itemsPerPage
return this.allItems.slice(start, end)
}
},
methods: {
nextPage() {
if (this.currentPage < this.totalPages) {
this.currentPage++
}
},
prevPage() {
if (this.currentPage > 1) {
this.currentPage--
}
}
}
}
后端分页实现方法
模板部分:

<template>
<div>
<ul>
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
<button @click="loadPrev" :disabled="!hasPrev">上一页</button>
<button @click="loadNext" :disabled="!hasNext">下一页</button>
</div>
</template>
脚本部分:
export default {
data() {
return {
items: [],
currentPage: 1,
hasNext: false,
hasPrev: false
}
},
created() {
this.fetchData()
},
methods: {
async fetchData() {
const response = await axios.get(`/api/items?page=${this.currentPage}`)
this.items = response.data.items
this.hasNext = response.data.hasNext
this.hasPrev = response.data.hasPrev
},
loadNext() {
if (this.hasNext) {
this.currentPage++
this.fetchData()
}
},
loadPrev() {
if (this.hasPrev) {
this.currentPage--
this.fetchData()
}
}
}
}
无限滚动分页实现
结合v-infinite-scroll指令实现无限滚动:
<template>
<div v-infinite-scroll="loadMore" infinite-scroll-disabled="busy" infinite-scroll-distance="10">
<div v-for="item in items" :key="item.id">{{ item.name }}</div>
</div>
</template>
脚本部分:

export default {
data() {
return {
items: [],
page: 1,
busy: false,
hasMore: true
}
},
methods: {
async loadMore() {
if (this.busy || !this.hasMore) return
this.busy = true
try {
const response = await axios.get(`/api/items?page=${this.page}`)
this.items = [...this.items, ...response.data.items]
this.hasMore = response.data.hasMore
this.page++
} finally {
this.busy = false
}
}
}
}
使用第三方组件库
Element UI分页组件示例:
<template>
<el-pagination
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-size="pageSize"
:total="total">
</el-pagination>
</template>
脚本部分:
export default {
data() {
return {
currentPage: 1,
pageSize: 10,
total: 0,
items: []
}
},
methods: {
handleCurrentChange(val) {
this.currentPage = val
this.fetchData()
},
async fetchData() {
const response = await axios.get(`/api/items?page=${this.currentPage}`)
this.items = response.data.items
this.total = response.data.total
}
}
}
性能优化建议
对于大数据量分页,考虑使用虚拟滚动技术。Vue-virtual-scroll-list是一个不错的选择:
npm install vue-virtual-scroll-list
实现示例:
<template>
<virtual-list :size="50" :remain="20" :data="items">
<div v-for="item in items" :key="item.id">{{ item.name }}</div>
</virtual-list>
</template>
分页加载的实现方式应根据具体业务场景选择,前端分页适合小数据量,后端分页适合大数据量,无限滚动适合移动端浏览体验。






