- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > web開(kāi)發(fā) > JavaScript >
- Vue使用v-model封裝el-pagination組件的全過(guò)程
使用v-model綁定分頁(yè)信息對象,分頁(yè)信息對象包括3個(gè)核心屬性參數,分頁(yè)事件直接綁定查詢(xún)數據的方法,消除父組件的handleSizeChange和handleCurrentChange的綁定事件方法。
通過(guò)封裝el-pagination組件開(kāi)發(fā)自定義分頁(yè)組件的類(lèi)似文章網(wǎng)上已經(jīng)有很多了,但看了一圈,總是不如意,于是決定還是自己動(dòng)手搞一個(gè)。
利用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 : { //查詢(xún)信息 queryInfo:{ userType : 0, deleteFlag: 2, //表示所有類(lèi)型 pagenum : 1, pagesize : 10 }, // 用戶(hù)類(lèi)型選擇框當前選中顯示標簽值 userTypeLabel : "所有類(lèi)型", // 用戶(hù)狀態(tài)選擇框當前選中顯示標簽值 userStatusLabel : "所有類(lèi)型" }, // 分頁(yè)信息 pageInfo:{ pagenum : 1, pagesize : 10, total : 0 } } }, methods: { // 查詢(xún)用戶(hù)信息列表 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){ //如果查詢(xún)成功 _this.pageInfo.total = res.data.data.length; _this.userInfoList = res.data.data; }else{ alert(res.data.message); } }).catch(error => { alert('查詢(xún)失??!'); console.log(error); }); }, // 每頁(yè)條數改變 handleSizeChange(newSize) { this.pageInfo.pagesize = newSize; this.queryUsers(); }, // 當前頁(yè)碼改變 handleCurrentChange(newPage) { this.pageInfo.pagenum = newPage; this.queryUsers(); } }
每個(gè)分頁(yè)查詢(xún),都需要這么來(lái)一套,有點(diǎn)簡(jiǎn)單重復,又略有不同,即查詢(xún)數據的方法會(huì )不同。
對于有強迫癥的程序猿來(lái)說(shuō),簡(jiǎn)單重復的代碼無(wú)疑非常令人不爽。因此,需要將之組件化。
分析el-pagination分頁(yè)組件:
自定義分頁(yè)組件的開(kāi)發(fā)目標:消除父組件的handleSizeChange和handleCurrentChange的綁定事件方法。
思路:使用v-model綁定分頁(yè)信息對象,分頁(yè)信息對象包括3個(gè)核心屬性參數,即上述的pageInfo。然后分頁(yè)事件直接綁定查詢(xún)數據的方法。
編寫(xiě)一個(gè)自定義分頁(yè)組件代碼,文件為/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 : { // 每頁(yè)條數選擇項 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>
自定義分頁(yè)組件,名稱(chēng)為pagination,其使用v-model,實(shí)現雙向數據通信。當頁(yè)碼或每頁(yè)條數改變時(shí),觸發(fā)分頁(yè)事件@pagination,提供與父組件方法綁定。
此處約定了pageInfo的字段結構如下:
pageInfo:{ pagenum : 1, //Number pagesize : 10, //Number total : 0 //Number }
父組件必須提供相同結構的數據對象來(lái)綁定組件內部的pageInfo對象。
然后注冊此分頁(yè)組件,在main.js中加入下列代碼:
import pagination from '@/components/Pagination.vue' // 注冊分頁(yè)插件 Vue.component('pagination', pagination)
用pagination組件修改前面第二章的代碼。
模板部分:
<!-- 分頁(yè)區域 --> <pagination v-model="pageInfo" @pagination="queryUsers"></pagination>
腳本部分:
export default { data() { return { formData : { //查詢(xún)信息 queryInfo:{ userType : 0, deleteFlag: 2, //表示所有類(lèi)型 pagenum : 1, pagesize : 10 }, // 用戶(hù)類(lèi)型選擇框當前選中顯示標簽值 userTypeLabel : "所有類(lèi)型", // 用戶(hù)狀態(tài)選擇框當前選中顯示標簽值 userStatusLabel : "所有類(lèi)型" }, // 分頁(yè)信息 pageInfo:{ pagenum : 1, pagesize : 10, total : 0 } } }, methods: { // 查詢(xún)用戶(hù)信息列表 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){ //如果查詢(xún)成功 _this.pageInfo.total = res.data.data.length; _this.userInfoList = res.data.data; }else{ alert(res.data.message); } }).catch(error => { alert('查詢(xún)失??!'); console.log(error); }); } }
這樣,就去掉了handleSizeChange和handleCurrentChange事件響應方法了。分頁(yè)信息發(fā)生改變時(shí),觸發(fā)綁定的queryUsers方法。
另外,如需調整pageSizes,則在模板處類(lèi)似如下設置:
:pageSizes=[10,20,30,50,100]
此組件開(kāi)發(fā)主要參考了下列文章:
Vue+el-pagination二次封裝,
vue項目 使用elementui中的el-pagination封裝公用分頁(yè)組件,
到此這篇關(guān)于Vue使用v-model封裝el-pagination組件的全過(guò)程的文章就介紹到這了,更多相關(guān)v-model封裝el-pagination組件內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站