文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Vue使用v-model封装el-pagination组件的详细步骤

2023-06-20 13:55

关注

这篇文章主要介绍“Vue使用v-model封装el-pagination组件的详细步骤”,在日常操作中,相信很多人在Vue使用v-model封装el-pagination组件的详细步骤问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”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分页组件:

  1. 有三个核心属性参数,分别是:当前页码(current-page)、每页条数(page-size)、总记录条数(total)。核心属性参数通过绑定父组件页面数据,实行双向联动。其中当前页码和每页条数一般通过操作分页子组件来改变,总记录条数通过查询数据后由父组件进行设置。

  2. 有两个事件:分别是:@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组件的详细步骤”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯