vue 实现数据分页
实现数据分页的方法
在Vue中实现数据分页可以通过多种方式完成,以下介绍几种常见的方法:
使用计算属性实现前端分页
通过计算属性对数据进行切片处理,结合分页参数实现分页效果。

<template>
<div>
<ul>
<li v-for="item in paginatedData" :key="item.id">
{{ item.name }}
</li>
</ul>
<button @click="prevPage" :disabled="currentPage === 1">上一页</button>
<span>当前页: {{ currentPage }}</span>
<button @click="nextPage" :disabled="currentPage === pageCount">下一页</button>
</div>
</template>
<script>
export default {
data() {
return {
items: [], // 原始数据
currentPage: 1,
itemsPerPage: 10
}
},
computed: {
pageCount() {
return Math.ceil(this.items.length / this.itemsPerPage)
},
paginatedData() {
const start = (this.currentPage - 1) * this.itemsPerPage
const end = start + this.itemsPerPage
return this.items.slice(start, end)
}
},
methods: {
nextPage() {
if (this.currentPage < this.pageCount) {
this.currentPage++
}
},
prevPage() {
if (this.currentPage > 1) {
this.currentPage--
}
}
}
}
</script>
使用第三方分页组件
可以集成成熟的第三方分页组件,如Element UI的Pagination组件:

<template>
<div>
<el-table :data="paginatedData">
<!-- 表格列定义 -->
</el-table>
<el-pagination
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-size="itemsPerPage"
:total="totalItems"
layout="prev, pager, next">
</el-pagination>
</div>
</template>
<script>
export default {
data() {
return {
items: [], // 原始数据
currentPage: 1,
itemsPerPage: 10
}
},
computed: {
totalItems() {
return this.items.length
},
paginatedData() {
const start = (this.currentPage - 1) * this.itemsPerPage
const end = start + this.itemsPerPage
return this.items.slice(start, end)
}
},
methods: {
handleCurrentChange(val) {
this.currentPage = val
}
}
}
</script>
结合后端API实现分页
对于大数据量情况,建议使用后端分页,通过API获取分页数据:
<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="!hasMore">下一页</button>
</div>
</template>
<script>
export default {
data() {
return {
items: [],
currentPage: 1,
itemsPerPage: 10,
hasMore: true
}
},
methods: {
fetchData() {
// 调用API获取数据
api.getItems({
page: this.currentPage,
limit: this.itemsPerPage
}).then(response => {
this.items = response.data.items
this.hasMore = response.data.hasMore
})
},
nextPage() {
if (this.hasMore) {
this.currentPage++
this.fetchData()
}
},
prevPage() {
if (this.currentPage > 1) {
this.currentPage--
this.fetchData()
}
}
},
created() {
this.fetchData()
}
}
</script>
使用Vuex管理分页状态
对于大型应用,可以使用Vuex集中管理分页状态:
// store.js
export default new Vuex.Store({
state: {
items: [],
currentPage: 1,
itemsPerPage: 10,
totalItems: 0
},
mutations: {
SET_ITEMS(state, payload) {
state.items = payload.items
state.totalItems = payload.total
},
SET_PAGE(state, page) {
state.currentPage = page
}
},
actions: {
async fetchItems({ commit, state }) {
const response = await api.getItems({
page: state.currentPage,
limit: state.itemsPerPage
})
commit('SET_ITEMS', {
items: response.data.items,
total: response.data.total
})
}
}
})
以上方法可以根据项目需求选择适合的实现方式,前端分页适合数据量小的情况,后端分页适合大数据量场景。






