vue分页怎么实现
Vue 分页实现方法
使用 Element UI 的分页组件
Element UI 提供了现成的分页组件 el-pagination,适合快速集成。需要先安装 Element UI 库。

<template>
<div>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 30, 50]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total">
</el-pagination>
</div>
</template>
<script>
export default {
data() {
return {
currentPage: 1,
pageSize: 10,
total: 100
};
},
methods: {
handleSizeChange(val) {
this.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.currentPage = val;
this.fetchData();
},
fetchData() {
// 调用 API 获取数据,传递 currentPage 和 pageSize 参数
}
}
};
</script>
自定义分页组件
如果需要完全自定义分页逻辑,可以手动实现分页按钮和数据切片。

<template>
<div>
<div v-for="item in paginatedData" :key="item.id">
{{ item.name }}
</div>
<button @click="prevPage" :disabled="currentPage === 1">上一页</button>
<span>第 {{ currentPage }} 页</span>
<button @click="nextPage" :disabled="currentPage === totalPages">下一页</button>
</div>
</template>
<script>
export default {
data() {
return {
data: [], // 原始数据
currentPage: 1,
pageSize: 10
};
},
computed: {
totalPages() {
return Math.ceil(this.data.length / this.pageSize);
},
paginatedData() {
const start = (this.currentPage - 1) * this.pageSize;
const end = start + this.pageSize;
return this.data.slice(start, end);
}
},
methods: {
prevPage() {
if (this.currentPage > 1) this.currentPage--;
},
nextPage() {
if (this.currentPage < this.totalPages) this.currentPage++;
}
}
};
</script>
结合后端 API 分页
实际项目中,分页通常由后端处理。前端传递页码和每页条数,后端返回对应数据。
methods: {
async fetchData() {
const params = {
page: this.currentPage,
size: this.pageSize
};
const response = await axios.get('/api/data', { params });
this.data = response.data.list;
this.total = response.data.total;
}
}
使用第三方库
如果需要更复杂的功能(如无限滚动),可以考虑第三方库如 vue-infinite-loading。
<template>
<div>
<div v-for="item in items" :key="item.id">{{ item.name }}</div>
<infinite-loading @infinite="loadMore"></infinite-loading>
</div>
</template>
<script>
import InfiniteLoading from 'vue-infinite-loading';
export default {
components: { InfiniteLoading },
data() {
return {
items: [],
page: 1
};
},
methods: {
async loadMore($state) {
const response = await axios.get('/api/data', { params: { page: this.page } });
if (response.data.length) {
this.items.push(...response.data);
this.page++;
$state.loaded();
} else {
$state.complete();
}
}
}
};
</script>






