Vue 手写一个分页组件

今天遇到一个需求是在分页组件中的每页显示个数选择器加个所有的选择。系统分页组件用的是 element ui pagination,当本人在 page-sizes 属性中添加‘所有’进去。出现的内容如下:
202003272132.png

这。。。怎么行。于是自己动手写了一个。

1、创建 wtecthtec-pagenation.vue在components 目录下
2、设置 props 参数,也就是分页组件需要配置的参数,:
/* 需要参数 :
pageSizes:对象数组,显示每页显示个数选择器  [{value:100,name:100}]
pageSize: 当前选择的每页显示个数值
total: 总条数
pageNums: 总页数
*/
props:{
   pageInfo:{
      type: Object,
    },
},
3、渲染页面:
<template>
    <div class="page">
      <span class="total-text"> 共 {{ pageInfo.total }} 条 </span>

      <select class="form-control" @change="handlePageSize"  v-model="pageInfo.pageSize">
        <option v-for="(sItem,index) in pageInfo.pageSizes" :value="sItem.value"   :key="index"  >
          {{  sItem.name | filerPageSizes }}
        </option>
      </select>
      <span :class="[currentPage === 1?'no-activite' : 'can-activite','operation'] " @click="handleCurrenPage('up')" >上一页 </span>
          <span v-show="startPage > 1 && pageInfo.pageNums >= 7" > ... </span>
          <span  :class="[currentPage===pageVal ? 'activited':'can-activite']"
                 v-for="pageVal in getShowPages()" :key="pageVal" @click="handleCurrenPage(pageVal)"> {{ pageVal }} </span>
          <span v-show="endPage < pageInfo.pageNums"> ... </span>
      <span :class="[currentPage === pageInfo.pageNums?'no-activite' : 'can-activite','operation'] " @click="handleCurrenPage('next')">下一页</span>
    </div>
</template>
4、添加逻辑事件:

数据过滤器

/* 数据过滤器,当pageSizes[n].name 为数字时就显示 name + 条/页 */
filters:{
        filerPageSizes(item){
          if (Number.isInteger(item)) {
             return item +'条/页'
          }else {
            return item
          }
        }
      },

触发 每页显示个数选择器 事件

  // 触发 每页显示个数选择器 事件
        handlePageSize(type){
           //  console.log('handlePageSize: ',this.pageInfo.pageSize)
           //   this.getPageNums()
            this.currentPage = 1
// 将事件暴露出去,在使用组件时,可以自定义handlePageSize事件
            this.$emit('handlePageSize', this.pageInfo.pageSize);
        },

触发当前页码点击

 // 触发当前页码点击
        handleCurrenPage(val){
           // console.log('handleCurrenPage:',val)
           //上一页处理
           if (val === 'up') {
             if (this.currentPage === 1) return
             this.currentPage =   this.currentPage - 1
           }
          //下一页处理
           else  if (val === 'next') {
            if (this.currentPage === this.pageInfo.pageNums) return
             this.currentPage =   this.currentPage+ 1
          }  else {
             if ( this.currentPage === val) return
             this.currentPage = val
           }
          this.$emit('handleCurrenPage', this.currentPage);
        },

// 计算当前显示的页码

 // 计算当前显示的页码
        getShowPages(){
           let showPages = []
           let start = this.currentPage > 3? this.currentPage - 3 : 1
            let end = this.pageInfo.pageNums > 7? this.currentPage + 3:this.pageInfo.pageNums
            if(this.pageInfo.pageNums <= 7) {
                 start = 1
                 end = this.pageInfo.pageNums
            } else {
                if (start === 1) end = 7
                if (end >  this.pageInfo.pageNums){
                  start = (start - (end - this.pageInfo.pageNums) ) <= 0? 1 :  (start - (end - this.pageInfo.pageNums) )
                  end = this.pageInfo.pageNums
                }
            }
            this.startPage =  start
            this.endPage = end
            for (start; start <= end; start++) {
              showPages.push(start)
            }
            return showPages
        }

// 计算共有多少页

getPageNums(){
            let  nums = parseInt( this.pageInfo.total / this.pageInfo.pageSize)
            if (this.pageInfo.total % this.pageInfo.pageSize > 0){
              nums += 1
            }
            this.pageInfo.pageNums = nums
      
      //    console.log('getPageNums :', this.pageSize)

        },
4、在App.vue调用

引用:

import  PageCom from './wtecthtec-pagenation'

注册组件

  components:{
    PageCom
  },

加载

<PageCom  :page-info="pageInfo" @handlePageSize="handlePageSizeVal"  @handleCurrenPage="handleCurrenPageVal"></PageCom>

参数

pageInfo:{
         pageSizes:[
           {value: 10,name: 10},
           {value: 20,name: 20},
           {value: 30,name: 30},
         ],
       pageSize: 10,
       total:100,
       pageNums:10
     }

事件

 handlePageSizeVal(val){
    console.log(`当前选条/页 ${val}`)
  },
  handleCurrenPageVal(val){
     console.log(`当前页 ${val}`)
  }

运行显示:
202003272150.png

源码

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天也想MK代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值