vue加载实现分页
Vue 实现分页加载的方法
使用 Element UI 的分页组件
安装 Element UI 后,可以直接使用其分页组件。在模板中添加分页组件,并绑定相关事件和数据。
<template>
<div>
<el-table :data="tableData">
<!-- 表格列定义 -->
</el-table>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 30, 40]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total">
</el-pagination>
</div>
</template>
在脚本部分定义相关数据和方法:
<script>
export default {
data() {
return {
tableData: [],
currentPage: 1,
pageSize: 10,
total: 0
}
},
methods: {
handleSizeChange(val) {
this.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.currentPage = val;
this.fetchData();
},
fetchData() {
// 调用 API 获取数据
const params = {
page: this.currentPage,
size: this.pageSize
};
// 假设有一个 getData 方法用于获取数据
getData(params).then(res => {
this.tableData = res.data;
this.total = res.total;
});
}
},
created() {
this.fetchData();
}
}
</script>
使用自定义分页逻辑
如果不使用 UI 库,可以手动实现分页逻辑。在模板中创建分页控件:
<template>
<div>
<table>
<!-- 表格内容 -->
</table>
<div class="pagination">
<button @click="prevPage" :disabled="currentPage === 1">上一页</button>
<span>第 {{ currentPage }} 页</span>
<button @click="nextPage" :disabled="currentPage === totalPages">下一页</button>
</div>
</div>
</template>
在脚本部分实现分页逻辑:
<script>
export default {
data() {
return {
data: [],
currentPage: 1,
pageSize: 10,
totalItems: 0
}
},
computed: {
totalPages() {
return Math.ceil(this.totalItems / this.pageSize);
}
},
methods: {
prevPage() {
if (this.currentPage > 1) {
this.currentPage--;
this.fetchData();
}
},
nextPage() {
if (this.currentPage < this.totalPages) {
this.currentPage++;
this.fetchData();
}
},
fetchData() {
// 调用 API 获取数据
const params = {
page: this.currentPage,
size: this.pageSize
};
// 假设有一个 getData 方法用于获取数据
getData(params).then(res => {
this.data = res.data;
this.totalItems = res.total;
});
}
},
created() {
this.fetchData();
}
}
</script>
使用无限滚动加载
对于无限滚动加载,可以使用第三方库如 vue-infinite-loading。安装后,在组件中使用:
<template>
<div>
<div v-for="item in items" :key="item.id">
<!-- 渲染每一项 -->
</div>
<infinite-loading @infinite="infiniteHandler"></infinite-loading>
</div>
</template>
在脚本部分实现无限滚动逻辑:
<script>
import InfiniteLoading from 'vue-infinite-loading';
export default {
components: {
InfiniteLoading
},
data() {
return {
items: [],
page: 1,
size: 10
}
},
methods: {
infiniteHandler($state) {
getData({
page: this.page,
size: this.size
}).then(res => {
if (res.data.length) {
this.items = this.items.concat(res.data);
this.page++;
$state.loaded();
} else {
$state.complete();
}
});
}
}
}
</script>
使用 Vuex 管理分页状态
对于大型应用,可以使用 Vuex 管理分页状态。首先定义 Vuex store:
// store.js
export default new Vuex.Store({
state: {
data: [],
currentPage: 1,
pageSize: 10,
total: 0
},
mutations: {
SET_DATA(state, payload) {
state.data = payload.data;
state.total = payload.total;
},
SET_PAGE(state, page) {
state.currentPage = page;
}
},
actions: {
fetchData({ commit, state }) {
const params = {
page: state.currentPage,
size: state.pageSize
};
getData(params).then(res => {
commit('SET_DATA', res);
});
}
}
});
在组件中调用 Vuex actions:
<script>
import { mapState, mapActions } from 'vuex';
export default {
computed: {
...mapState(['data', 'currentPage', 'pageSize', 'total'])
},
methods: {
...mapActions(['fetchData']),
handlePageChange(page) {
this.$store.commit('SET_PAGE', page);
this.fetchData();
}
},
created() {
this.fetchData();
}
}
</script>
以上方法可以根据具体需求选择适合的实现方式,灵活应用于不同场景。







