Vue如何实现结果分页
Vue 实现结果分页的方法
使用 Element UI 的分页组件
Element UI 提供了现成的分页组件 el-pagination,可以快速实现分页功能。安装 Element UI 后,在组件中引入并使用分页组件。
<template>
<div>
<el-table :data="currentPageData">
<!-- 表格内容 -->
</el-table>
<el-pagination
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-size="pageSize"
:total="totalData.length"
layout="prev, pager, next"
>
</el-pagination>
</div>
</template>
<script>
export default {
data() {
return {
totalData: [], // 所有数据
currentPage: 1,
pageSize: 10,
};
},
computed: {
currentPageData() {
const start = (this.currentPage - 1) * this.pageSize;
const end = start + this.pageSize;
return this.totalData.slice(start, end);
},
},
methods: {
handleCurrentChange(val) {
this.currentPage = val;
},
},
};
</script>
手动实现分页逻辑
如果不使用 UI 框架,可以通过计算属性手动实现分页逻辑。

<template>
<div>
<table>
<tr v-for="item in currentPageData" :key="item.id">
<td>{{ item.name }}</td>
</tr>
</table>
<button @click="prevPage">上一页</button>
<span>{{ currentPage }}</span>
<button @click="nextPage">下一页</button>
</div>
</template>
<script>
export default {
data() {
return {
totalData: [], // 所有数据
currentPage: 1,
pageSize: 10,
};
},
computed: {
currentPageData() {
const start = (this.currentPage - 1) * this.pageSize;
const end = start + this.pageSize;
return this.totalData.slice(start, end);
},
},
methods: {
prevPage() {
if (this.currentPage > 1) {
this.currentPage--;
}
},
nextPage() {
if (this.currentPage < Math.ceil(this.totalData.length / this.pageSize)) {
this.currentPage++;
}
},
},
};
</script>
使用第三方库
如果需要更复杂的分页功能,可以考虑使用第三方库如 vue-paginate 或 v-pagination。这些库提供了更多自定义选项和功能。
安装 vue-paginate:

npm install vue-paginate
使用示例:
<template>
<div>
<ul>
<li v-for="item in paginatedData" :key="item.id">
{{ item.name }}
</li>
</ul>
<paginate
v-model="currentPage"
:page-count="totalPages"
:click-handler="changePage"
:prev-text="'Prev'"
:next-text="'Next'"
>
</paginate>
</div>
</template>
<script>
import Paginate from 'vue-paginate';
export default {
components: {
Paginate,
},
data() {
return {
totalData: [], // 所有数据
currentPage: 1,
pageSize: 10,
};
},
computed: {
paginatedData() {
const start = (this.currentPage - 1) * this.pageSize;
const end = start + this.pageSize;
return this.totalData.slice(start, end);
},
totalPages() {
return Math.ceil(this.totalData.length / this.pageSize);
},
},
methods: {
changePage(pageNum) {
this.currentPage = pageNum;
},
},
};
</script>
后端分页
如果数据量很大,建议在后端实现分页逻辑,前端仅发送分页参数并接收分页后的数据。
<template>
<div>
<table>
<tr v-for="item in data" :key="item.id">
<td>{{ item.name }}</td>
</tr>
</table>
<el-pagination
@current-change="fetchData"
:current-page="currentPage"
:page-size="pageSize"
:total="total"
layout="prev, pager, next"
>
</el-pagination>
</div>
</template>
<script>
export default {
data() {
return {
data: [],
currentPage: 1,
pageSize: 10,
total: 0,
};
},
methods: {
fetchData(page) {
axios.get('/api/data', {
params: {
page,
pageSize: this.pageSize,
},
}).then((res) => {
this.data = res.data.list;
this.total = res.data.total;
});
},
},
created() {
this.fetchData(this.currentPage);
},
};
</script>






