Vue使用v-model封裝el-pagination組件的全過程
使用v-model綁定分頁信息對象,分頁信息對象包括3個核心屬性參數,分頁事件直接綁定查詢數據的方法,消除父組件的handleSizeChange和handleCurrentChange的綁定事件方法。
1、前言
通過封裝el-pagination組件開發自定義分頁組件的類似文章網上已經有很多瞭,但看瞭一圈,總是不如意,於是決定還是自己動手搞一個。
2、背景
2.1、常規分頁處理方法
利用el-pagination組件的常規做法如下:
模板部分:
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="pageInfo.pagenum" :page-sizes="[5, 10, 15, 20]" :page-size="pageInfo.pagesize" layout="total, sizes, prev, pager, next, jumper" :total="pageInfo.total" background> </el-pagination>
腳本部分:
export default { data() { return { formData : { //查詢信息 queryInfo:{ userType : 0, deleteFlag: 2, //表示所有類型 pagenum : 1, pagesize : 10 }, // 用戶類型選擇框當前選中顯示標簽值 userTypeLabel : "所有類型", // 用戶狀態選擇框當前選中顯示標簽值 userStatusLabel : "所有類型" }, // 分頁信息 pageInfo:{ pagenum : 1, pagesize : 10, total : 0 } } }, methods: { // 查詢用戶信息列表 queryUsers(){ let _this = this; //console.log(this.pageInfo); this.formData.queryInfo.pagenum = this.pageInfo.pagenum; this.formData.queryInfo.pagesize = this.pageInfo.pagesize; this.instance.queryUsers( this.$baseUrl,this.formData.queryInfo ).then(res => { //console.log(res.data); if (res.data.code == this.global.SucessRequstCode){ //如果查詢成功 _this.pageInfo.total = res.data.data.length; _this.userInfoList = res.data.data; }else{ alert(res.data.message); } }).catch(error => { alert('查詢失敗!'); console.log(error); }); }, // 每頁條數改變 handleSizeChange(newSize) { this.pageInfo.pagesize = newSize; this.queryUsers(); }, // 當前頁碼改變 handleCurrentChange(newPage) { this.pageInfo.pagenum = newPage; this.queryUsers(); } }
2.2、問題分析
每個分頁查詢,都需要這麼來一套,有點簡單重復,又略有不同,即查詢數據的方法會不同。
對於有強迫癥的程序猿來說,簡單重復的代碼無疑非常令人不爽。因此,需要將之組件化。
分析el-pagination分頁組件:
- 有三個核心屬性參數,分別是:當前頁碼(current-page)、每頁條數(page-size)、總記錄條數(total)。核心屬性參數通過綁定父組件頁面數據,實行雙向聯動。其中當前頁碼和每頁條數一般通過操作分頁子組件來改變,總記錄條數通過查詢數據後由父組件進行設置。
- 有兩個事件:分別是:@size-change(每頁條數改變事件)、@current-change(當前頁碼改變事件)。這兩個事件,分別綁定父組件的對應事件處理方法handleSizeChange和handleCurrentChange,兩者均調用查詢數據的方法,查詢數據的方法中,得到結果集後,設置總記錄條數。
自定義分頁組件的開發目標:消除父組件的handleSizeChange和handleCurrentChange的綁定事件方法。
思路:使用v-model綁定分頁信息對象,分頁信息對象包括3個核心屬性參數,即上述的pageInfo。然後分頁事件直接綁定查詢數據的方法。
3、方案實施
3.1、自定義分頁組件
編寫一個自定義分頁組件代碼,文件為/src/Pagination.vue。代碼如下:
<template lang="html"> <div class="pagination"> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page.sync="pageInfo.pagenum" :page-size="pageInfo.pagesize" :page-sizes="pageSizes" :total="pageInfo.total" layout="total, sizes, prev, pager, next, jumper" background > </el-pagination> </div> </template> <script> export default { name : "pagination", model : { prop : 'pageInfo', event : 'change' }, props : { // 每頁條數選擇項 pageSizes: { type: Array, default() { return [5, 10, 15, 20]; } }, // v-model綁定的數據對象 pageInfo: { type: Object, reuqired:true } }, data(){ return { } }, methods: { handleSizeChange(newSize) { var newValue={ pagesize : newSize, pagenum : newSize <= this.total ? 1 : this.pageInfo['pagenum'] }; this.$emit('change',Object.assign(this.pageInfo,newValue)); this.$emit('pagination'); }, handleCurrentChange(newPage) { this.$emit('change',Object.assign(this.pageInfo,{pagenum : newPage})); this.$emit('pagination'); } } } </script> <style lang="css" scoped> .pagination { padding: 10px 0; text-align: center; } </style>
自定義分頁組件,名稱為pagination,其使用v-model,實現雙向數據通信。當頁碼或每頁條數改變時,觸發分頁事件@pagination,提供與父組件方法綁定。
此處約定瞭pageInfo的字段結構如下:
pageInfo:{ pagenum : 1, //Number pagesize : 10, //Number total : 0 //Number }
父組件必須提供相同結構的數據對象來綁定組件內部的pageInfo對象。
3.2、註冊分頁組件
然後註冊此分頁組件,在main.js中加入下列代碼:
import pagination from '@/components/Pagination.vue' // 註冊分頁插件 Vue.component('pagination', pagination)
3.3、父組件調用方法
用pagination組件修改前面第二章的代碼。
模板部分:
<!-- 分頁區域 --> <pagination v-model="pageInfo" @pagination="queryUsers"></pagination>
腳本部分:
export default { data() { return { formData : { //查詢信息 queryInfo:{ userType : 0, deleteFlag: 2, //表示所有類型 pagenum : 1, pagesize : 10 }, // 用戶類型選擇框當前選中顯示標簽值 userTypeLabel : "所有類型", // 用戶狀態選擇框當前選中顯示標簽值 userStatusLabel : "所有類型" }, // 分頁信息 pageInfo:{ pagenum : 1, pagesize : 10, total : 0 } } }, methods: { // 查詢用戶信息列表 queryUsers(){ let _this = this; //console.log(this.pageInfo); this.formData.queryInfo.pagenum = this.pageInfo.pagenum; this.formData.queryInfo.pagesize = this.pageInfo.pagesize; this.instance.queryUsers( this.$baseUrl,this.formData.queryInfo ).then(res => { //console.log(res.data); if (res.data.code == this.global.SucessRequstCode){ //如果查詢成功 _this.pageInfo.total = res.data.data.length; _this.userInfoList = res.data.data; }else{ alert(res.data.message); } }).catch(error => { alert('查詢失敗!'); console.log(error); }); } }
這樣,就去掉瞭handleSizeChange和handleCurrentChange事件響應方法瞭。分頁信息發生改變時,觸發綁定的queryUsers方法。
另外,如需調整pageSizes,則在模板處類似如下設置:
:pageSizes=[10,20,30,50,100]
4、參考文章
此組件開發主要參考瞭下列文章:
Vue+el-pagination二次封裝,https://blog.csdn.net/weixin_47259997/article/details/107887823。
vue項目 使用elementui中的el-pagination封裝公用分頁組件,https://www.jianshu.com/p/e241e5710fb0/。
到此這篇關於Vue使用v-model封裝el-pagination組件的全過程的文章就介紹到這瞭,更多相關v-model封裝el-pagination組件內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- js如何使用Pagination+PageHelper實現分頁
- vue使用elementUI分頁如何實現切換頁面時返回頁面頂部
- vue父組件監聽子組件數據更新方式(hook)
- Vue組件庫ElementUI實現表格列表分頁效果
- Vue+ElementUI 封裝簡易PaginationSelect組件的詳細步驟