vue封装分页组件并注册为全局组件

在components文件夹中新建paging.vue文件

<template>
  <div class="pagingBox">
    <div class="pagItem"
         @click="pageChange(1)">
      {{isEn?'First':'首页'}}
    </div>
    <div class="pagItem"
         @click="pageChange('pre')">
      {{isEn?'Previous':'上一页'}}
    </div>
    <div v-if="pageList[2] - 2 > 1"
         class="pagItem">...</div>
    <div class="pagItem"
         v-for="(item, index) in pageList"
         :key="index"
         :class="{ pagActive: page == item }"
         @click="pageChange(item)">{{ item }}</div>
    <div v-if="pageMax - pageList[2] > 2"
         class="pagItem">...</div>
    <div class="pagItem"
         @click="pageChange('next')">
      {{isEn?'Next':'下一页'}}
    </div>
    <div class="pagItem"
         @click="pageChange(pageMax)">
      {{isEn?'Last':'尾页'}}
    </div>
    <div class="pagTotal"
         v-show="isTotal">
      {{isEn?'Total '+total:'共 '+total+' 条'}}
    </div>
  </div>
</template>

<script>
export default {
  props: {
    // 内容总数
    total: {
      type: Number,
      default: 0
    },
    // 每页数量
    limit: {
      type: Number,
      default: 10
    },
    // 当前页码
    page: {
      type: Number,
      default: 1
    },
    // 是否英文
    isEn: {
      type: Boolean,
      default: false
    },
    // 是否展示总数
    isTotal: {
      type: Boolean,
      default: false
    }
  },
  data () {
    return {
      pageList: [] // 页码列表
    };
  },
  computed: {
    // 最大页数
    pageMax () {
      return Math.ceil(this.total / this.limit);
    }
  },
  created () {
    this.initData();
  },
  methods: {
    // 生成pageList页码列表
    initData () {
      this.pageList = []; // 清空页码
      for (let i = 1; i <= this.pageMax; i++) {
        if (i <= 5) this.pageList.push(i);
      }
    },
    // 子组件事件回调:分页
    pageChange (pageCurrent) {
      if (pageCurrent == 'pre') {
        if (this.page > 1) {
          this.$emit('page-change', this.page - 1);
        } else {
          this.$emit('page-change', this.page);
        }
      } else if (pageCurrent == 'next') {
        if (this.page < this.pageMax) {
          this.$emit('page-change', this.page + 1);
        } else {
          this.$emit('page-change', this.page);
        }
      } else {
        this.$emit('page-change', pageCurrent);
      }
    }
  },
  watch: {
    // 监听页码变化 -> 页码列表更新
    page (val) {
      if (val <= 3) {
        this.initData();
      } else if (val === this.pageMax) {
        this.pageList = [val - 2, val - 1, val];
      } else if (val === this.pageMax - 1) {
        this.pageList = [val - 2, val - 1, val, val + 1];
      } else {
        this.pageList = [val - 2, val - 1, val, val + 1, val + 2];
      }
    },
    // 监听页码变化 -> 总数更新
    total () {
      this.initData();
    }
  }
};
</script>

<style scoped>
.pagingBox {
    margin-top: 35px;
    margin-bottom: 50px;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 16px;
    line-height: 18px;
}
.pagItem {
    padding: 7px 11px;
    border: 1px solid #ddd;
    color: #333;
    margin-right: 10px;
    cursor: pointer;
}
.pagActive {
    background: #0b8686;
    color: #fff;
    border: 1px solid #0b8686;
}
.pagTotal {
    font-size: 15px;
    color: rgb(58, 58, 58);
    margin-right: -40px;
    margin-left: 20px;
}
</style>

在main.js中引入并注册paging组件

import paging from '../../components/paging'
Vue.component('paging', paging)

使用paging分页组件

<template>
  <div>
    <paging :total="this.paging.total"
            :limit="this.paging.limit"
            :page="this.paging.page"
            isTotal
            @page-change="pageChange"></paging>
  </div>
</template>

<script>
export default {
  data () {
    return {
      paging: {
        total: 60,
        limit: 8,
        page: 1
      }
    };
  },
  methods: {
    pageChange (page) {
      if (page == this.paging.page) {
        return;
      }
      this.paging.page = page;
    }
  }
};
</script>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

初辰ge

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

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

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

打赏作者

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

抵扣说明:

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

余额充值