zoukankan      html  css  js  c++  java
  • vue 自定义分页组件

    vue2.5自定义分页组件,可设置每页显示条数,带跳转框直接跳转到相应页面

    Pagination.vue

    效果如下图:
    all:

    small(只显示数字和上一页和下一页):

    html

    <template>
      <div class="pagination" v-if="totalPage>1">
        <span v-if="!small" class="total">共{{totalCount}}条记录<!--  第{{currentPage}}/{{totalPage}}页--></span>
        <ul class="paging">
          <li class="prev" :class="{'disabled':currentPage<=1}" @click="currentPage<=1?'':turn(currentPage-1)"><i class="iconfont icon-chevron-left"></i></li>
          <li v-for="i in showPageBtn" class="num" :class="{'active':i==currentPage}" v-if="i>0" @click="turn(i)">{{i}}</li>
          <li v-else-if="i==='-'" class="num iconfont icon-more" :class="{'icon-d-arrow-left':toPrev}" @click="turn(currentPage-1)" @mouseenter="toPrev=true" @mouseleave="toPrev=false"></li>
          <li v-else-if="i==='+'" class="num iconfont icon-more" :class="{'icon-d-arrow-right':toNext}" @click="turn(currentPage+1)" @mouseenter="toNext=true" @mouseleave="toNext=false"></li>
          <li class="next" :class="{'disabled':currentPage>=totalPage}"  @click="currentPage>=totalPage?'':turn(currentPage+1)"><i class="iconfont icon-chevron-right"></i></li>
        </ul>
        <select v-if="!small" v-model="limitNum" @change="turn(currentPage)">
          <option v-for="item in limitNums" :value="item">{{item}}条/页</option>
        </select>
        <span  v-if="all" class="jump">前往<input type="number" autocomplete="off" min="1" :max="totalPage" v-model="goPage" @keyup.enter="turn(goPage)">页</span>
      </div>
    </template>

    js

    <script>
      export default {
        name:'MyPagination',
        props: {
          currentPage: {//当前页
            type: Number,
            default: 1,
          },
          limit:{//每页显示条数
            type: Number,
            default: 10,
          },
          totalCount:{//总条数
            type: Number,
            required: true
          },
          small:{
            type:Boolean,
            default: false,
          },
          all:{
            type:Boolean,
            default: false,
          }
        },
        data() {
          return {
            goPage:'',
            limitNum:'',
            limitNums:[5,10,15,20,25,30],
            toPrev:false,
            toNext:false,
          }
        },
        created: function () {
          this.initLimitNums();
        },
        computed: {
          totalPage(){
            return Math.ceil(this.totalCount / this.limit)
          },
          showPageBtn() {
            let pageNum = Number(this.totalPage),
              index = Number(this.currentPage),
              arr = [];
            if (pageNum <= 9) {
              for(let i = 1; i <= pageNum; i++) {
                arr.push(i)
              }
              return arr
            }
            if (index < 5) return [1,2,3,4,5,6,7,'+',pageNum]
            if (index >= pageNum -1) return [1,2,'-', pageNum -5,pageNum -4,pageNum -3, pageNum -2, pageNum -1, pageNum]
            if (index === pageNum -2) return [1,2,'-', pageNum -5,pageNum -4,pageNum-3, pageNum-2, pageNum-1, pageNum]
            return [1,'-', index-2,index-1, index, index + 1,index + 2, '+', pageNum]
          }
        },
        methods: {
          initLimitNums() {
            this.limitNum=this.limit;
            //if (this.limitNums.indexOf(this.limit) == -1) {
            if (!this.limitNums.includes(this.limit)) {
              this.limitNums.push(this.limit);
              this.limitNums.sort(function (a, b) {
                return a-b;
              });
            }
          },
          //翻页,显示条数变化
          turn(page) {
            let i = parseInt(Number(page));
            if(i<1){
              i=1;
            }else if(i>this.totalPage){
              i=this.totalPage;
            }
            if(this.limitNum!==this.limit&&this.limitNum!==''){//每页显示条数改变
              let pages=Math.ceil(this.totalCount / this.limitNum);
              if(page>pages){
                i=pages;
              }
              this.$emit('update:limit', this.limitNum);
            }
            this.$emit('update:currentPage', i);
            this.$emit('turn');
          }
        }
      }
    </script>
    <!--测试-分页-->
    <template>
      <div class="box">
        ...
         <my-pagination :currentPage.sync="currentPage"
                       :limit.sync="limit"
                       :totalCount="totalCount"
                       @turn="getTableData"></my-pagination>
      </div>
    </template>
    
    <script>
        export default {
            data() {
                return {
                    currentPage: 1,//当前页码
                    limit: 10,//每页显示条数
                    totalCount:0,//总页数
                }
            },
              created: function () {
              this.getTableData();
            },
            methods: {
              getTableData() {
                let params = this.$qs.stringify({
                  'pageSize': this.limit,
                  'pageNum': this.currentPage
                });
                this.$http.post('/api/...', params).then(res => {
                  this.totalCount = res.data.totalCount;
                });
              }
            }
        }
    </script>
    

    码云地址:
    https://gitee.com/chenlinsha/vue_template/tree/master/src/components/common/pagination

  • 相关阅读:
    centos7 安装jdk 1.8
    CentOS查看Java进程并部署jar包
    Mybatis传多个参数(三种解决方案)
    mybatis使用注解往postgresql数据库表insert数据[主键自增]的写法
    在Linux上安装tomcat和JDK
    Linux下部署springboot项目的步骤及过程
    maven安装第三方jar包到本地仓库
    Android 开源动画框架:NineOldAndroids
    Android多国语言的value文件夹命名方式
    C++编程经验-返回局部变量的讨论(转)
  • 原文地址:https://www.cnblogs.com/conglvse/p/9560606.html
Copyright © 2011-2022 走看看