Vue自定义组件开发:使用v-model封装el-pagination组件

1、前言

通过封装el-pagination组件开发自定义分页组件的类似文章网上已经有很多了,但看了一圈,总是不如意,于是决定还是自己动手搞一个。

2、背景

利用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();
    }
  }

每个分页查询,都需要这么来一套,有点简单重复,又略有不同,即查询数据的方法会不同。

对于有强迫症的程序猿来说,简单重复的代码无疑非常令人不爽。因此,需要将之组件化。

分析el-pagination分页组件:

自定义分页组件的开发目标:消除父组件的handleSizeChange和handleCurrentChange的绑定事件方法。

思路:使用v-model绑定分页信息对象,分页信息对象包括3个核心属性参数,即上述的pageInfo。然后分页事件直接绑定查询数据的方法。

3、方案实施

编写一个自定义分页组件代码,文件为/src/componets/Pagination.vue。代码如下:


  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');
      }
    }
  }

.pagination {
    padding: 10px 0;
    text-align: center;
}

自定义分页组件,名称为pagination,其使用v-model,实现双向数据通信。当页码或每页条数改变时,触发分页事件@pagination,提供与父组件方法绑定。

此处约定了pageInfo的字段结构如下:

      pageInfo:{
        pagenum   : 1,  //Number
        pagesize  : 10, //Number
        total     : 0   //Number
      }

父组件必须提供相同结构的数据对象来绑定组件内部的pageInfo对象。

然后注册此分页组件,在main.js中加入下列代码:

import pagination  from '@/components/Pagination.vue'

// 注册分页插件
Vue.component('pagination', pagination)

用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、参考文章

此组件开发主要参考了下列文章:

Original: https://www.cnblogs.com/alabo1999/p/14979800.html
Author: 阿拉伯1999
Title: Vue自定义组件开发:使用v-model封装el-pagination组件

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610243/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 关于Java中的继承和组合的一个错误使用的例子

    相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下。如果我某些地方写的不对,或者比较幼稚,论证不清晰,欢迎大家留言指正。 什么是「…

    Java 2023年5月29日
    085
  • Maven + SSM环境搭建

    Maven + SSM 之前Maven+SSM都是照着搭建的,自己想写点什么的时候发现搭建的过程不清楚。 于是花了时间边整理思路边搭建,并把搭建过程记录下来。 视频看来终觉浅,还是…

    Java 2023年6月8日
    069
  • java 递归转非递归(树形转非树形)

    接着上一篇讲,在上一篇我们已经将数据通过递归转成了树形结构。 如何将树形结构转非树形结构?(仍然按照树形层级关系进行平铺显示) 如何将递归函数转成迭代函数? 查看代码 [{ nam…

    Java 2023年5月29日
    0127
  • Java基础-续2

    抽象 抽象的,又叫理论上的。所谓理论上就是实际上没有。java中有抽象类和抽象方法。 抽象类:是使用abstract修饰的类: undefined 申明类的目的是规定一类对象的特征…

    Java 2023年6月7日
    077
  • Spring Boot整合RabbitMQ

    Spring Boot整合RabbitMQ Spring Boot整合RabbitMQ 写在开头 整合流程 配置文件 RabbitMQ配置 RabbitMQ生产者 RabbitMQ…

    Java 2023年6月5日
    072
  • 如何解决VMware 虚拟机不能铺满屏幕

    出现这种情况是因为分辨率设置问题,调整分辨率总能达到你想要的效果; 首先设置vmware为全屏模式 查看物理机的分辨率,然后再将虚拟机的分辨率设置了跟物理机的一致。完美解决 win…

    Java 2023年5月30日
    0186
  • 配置 JAVA 环境 JDK + IDEA

    搜索 ORACLE 官网,找到 JDK,下载 JDK8 版本 / JDK11 版本 选择合适的路径,我这里放在了 D 盘 配置下方系统环境变量,变量名为 JAVA_HOME,把刚刚…

    Java 2023年6月5日
    076
  • 分页数据展示后台代码和前台代码

    类别id传递 点击了不同的分类后将来看到的旅游线路不一样的。通过分析数据库表结构,发现 旅游线路表和分类表是一个多对一的关系 CategoryServiceImpl实现类: pub…

    Java 2023年6月6日
    099
  • Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解

    $remote_addr 代表客户端IP。注意,这里的客户端指的是直接请求Nginx的客户端,非间接请求的客户端。假设用户请求过程如下: &#x7528;&#x62…

    Java 2023年6月16日
    081
  • Redis的中并发问题的解决方案小结

    什么是Redis的并发竞争问题 Redis的并发竞争问题,主要是发生在并发写竞争。考虑到redis没有像db中的sql语句,update val = val + 10 where …

    Java 2023年6月9日
    077
  • Spring中Bean的五个作用域

    当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下5种作用域: singleton:单例模式,在…

    Java 2023年5月30日
    084
  • BTrace 初探

    BTrace 是一款java诊断工具,在解决现场问题的时候非常有用。 今天使用的时候碰到几个坑,先记录一下. 下载下来以后直接运行报错 root@iZ2ze89756yjbvq7l…

    Java 2023年6月16日
    074
  • 【java多线程】jdk的线程池

    一、JDK的线程池的核心参数 int corePoolSize :线程池中的核心线程数 int maximumPoolSize :线程池中的最大线程数 long keepAlive…

    Java 2023年5月29日
    0100
  • c 的陷阱

    c语言算是非常古老了,像瑞士军刀灵活却也很容易伤到自己,即使是多年的老杆子,以致于市面上都有一本经典的C的书叫《C陷阱与缺陷》的书。 这个文章总结下c中常见的陷阱,可能在日常工作或…

    Java 2023年5月29日
    089
  • spring-boot-starter-actuator

    使用: HTTP方法 路径 描述 鉴权 GET /autoconfig 查看自动配置的使用情况 true GET /configprops 查看配置属性,包括默认配置 true G…

    Java 2023年6月13日
    084
  • MyBatis-Plus修改数据,会不会把其他字段置为null

    前两天在用MyBatis-Plus写了一张单表的增删改查,在写到修改的时候,就突然蹦出一个奇怪的想法。 MyBatis-Plus的BaseMapper中有两个关于修改的方法。如下:…

    Java 2023年6月15日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球