vue实现后台分页
实现后台分页的关键步骤
安装依赖
确保项目已安装axios用于请求后端数据,若未安装可通过以下命令安装:
npm install axios
定义分页数据与状态 在Vue组件中定义分页相关数据:
data() {
return {
tableData: [], // 表格数据
currentPage: 1, // 当前页码
pageSize: 10, // 每页条数
total: 0, // 总数据量
loading: false // 加载状态
}
}
封装API请求方法 创建独立方法处理分页请求:
methods: {
fetchData() {
this.loading = true;
axios.get('/api/data', {
params: {
page: this.currentPage,
size: this.pageSize
}
}).then(response => {
this.tableData = response.data.list;
this.total = response.data.total;
}).finally(() => {
this.loading = false;
});
}
}
分页组件集成 使用Element UI的分页组件(需先安装Element UI):

<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next"
:total="total">
</el-pagination>
处理分页事件 添加分页变更处理方法:
methods: {
handleSizeChange(val) {
this.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.currentPage = val;
this.fetchData();
}
}
初始化加载数据 在生命周期钩子中触发初始数据加载:

created() {
this.fetchData();
}
注意事项
后端接口规范
要求后端接口接收page和size参数,返回格式应包含:
{
"list": [...],
"total": 100
}
性能优化建议
- 添加防抖处理频繁的页码切换
- 实现数据缓存减少重复请求
- 使用骨架屏提升用户体验
错误处理 增强请求的异常捕获:
axios.get('/api/data', {
params: { /*...*/ }
}).catch(error => {
console.error('请求失败:', error);
// 可添加用户提示
});
完整组件示例
<template>
<div>
<el-table :data="tableData" v-loading="loading">
<!-- 表格列定义 -->
</el-table>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next"
:total="total">
</el-pagination>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
tableData: [],
currentPage: 1,
pageSize: 10,
total: 0,
loading: false
}
},
methods: {
fetchData() {
this.loading = true;
axios.get('/api/data', {
params: {
page: this.currentPage,
size: this.pageSize
}
}).then(response => {
this.tableData = response.data.list;
this.total = response.data.total;
}).catch(error => {
console.error(error);
}).finally(() => {
this.loading = false;
});
},
handleSizeChange(val) {
this.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.currentPage = val;
this.fetchData();
}
},
created() {
this.fetchData();
}
}
</script>






