vue分页如何实现
Vue分页实现方法
使用Element UI的分页组件
安装Element UI库后,可以直接使用其分页组件。在模板中添加el-pagination,通过v-model绑定当前页码,设置total和page-size控制分页逻辑。

<template>
<el-pagination
v-model:currentPage="currentPage"
:page-size="pageSize"
:total="total"
@current-change="handleCurrentChange"
/>
</template>
<script>
export default {
data() {
return {
currentPage: 1,
pageSize: 10,
total: 100
}
},
methods: {
handleCurrentChange(val) {
this.currentPage = val
this.fetchData()
},
fetchData() {
// 根据currentPage和pageSize获取数据
}
}
}
</script>
自定义分页组件
创建一个自定义分页组件,包含页码按钮和导航逻辑。通过props接收总数据量、当前页和每页条数,通过emit事件通知父组件页码变化。

<template>
<div class="pagination">
<button @click="prevPage" :disabled="currentPage === 1">上一页</button>
<span v-for="page in pages" :key="page">
<button @click="goToPage(page)" :class="{ active: page === currentPage }">
{{ page }}
</button>
</span>
<button @click="nextPage" :disabled="currentPage === totalPages">下一页</button>
</div>
</template>
<script>
export default {
props: {
totalItems: Number,
currentPage: Number,
itemsPerPage: Number
},
computed: {
totalPages() {
return Math.ceil(this.totalItems / this.itemsPerPage)
},
pages() {
const range = []
for (let i = 1; i <= this.totalPages; i++) {
range.push(i)
}
return range
}
},
methods: {
prevPage() {
this.$emit('page-changed', this.currentPage - 1)
},
nextPage() {
this.$emit('page-changed', this.currentPage + 1)
},
goToPage(page) {
this.$emit('page-changed', page)
}
}
}
</script>
结合后端API实现分页
当数据量较大时,通常需要后端分页。前端传递页码和每页条数参数,后端返回对应数据。
methods: {
async fetchData() {
const response = await axios.get('/api/data', {
params: {
page: this.currentPage,
size: this.pageSize
}
})
this.data = response.data.items
this.total = response.data.total
}
}
使用Vuex管理分页状态
在大型应用中,可以使用Vuex集中管理分页状态,便于多个组件共享和同步分页信息。
// store.js
export default new Vuex.Store({
state: {
currentPage: 1,
pageSize: 10,
total: 0
},
mutations: {
setCurrentPage(state, page) {
state.currentPage = page
},
setTotal(state, total) {
state.total = total
}
},
actions: {
fetchData({ state, commit }) {
return axios.get('/api/data', {
params: {
page: state.currentPage,
size: state.pageSize
}
}).then(response => {
commit('setTotal', response.data.total)
return response.data.items
})
}
}
})






