Vue项目分页器

 分页器组件

接收传入的四个数据:pageNo、pageSize、total、continues

点击页码:触发父组件的自定义事件 getPageNo  传入要跳转的页码数

<template>
  <div class="pagination">
    <button :disabled="pageNo === 1" @click="setTotal(pageNo - 1)">
      上一页
    </button>
    <button v-if="startNum.start > 1" @click="setTotal(1)">1</button>
    <button v-if="startNum.start > 2">···</button>

    <button
      v-for="num in startNum.end"
      v-show="num >= startNum.start"
      :style="num === pageNo ? 'color:red; border: 1px solid red ' : ''"
      :key="num"
      @click="setTotal(num)"
    >
      {{ num }}
    </button>
    <button v-if="startNum.end < totalPage - 1">···</button>
    <button v-if="startNum.end < totalPage" @click="setTotal(totalPage)">
      {{ totalPage }}
    </button>
    <button :disabled="pageNo == totalPage" @click="setTotal(pageNo + 1)">
      下一页
    </button>

    <button style="margin-left: 30px">共 {{ total }} 条</button>
  </div>
</template>
  
  <script>
export default {
  name: "Pagination",
  props: ["pageNo", "pageSize", "total", "continues"],

  mounted() {
    this.startNum;
  },
  computed: {
    // 总页数(向上取整)
    totalPage() {
      return Math.ceil(this.total / this.pageSize);
    },
    // 页码起始结束数字
    startNum() {
      /*
        连续起始和结束页有四种情况:
            1)总页小于连续页
                起始页 = 1  
                结束页 = 总页

            2)总页大于等于连续页
                起始页 = 当前页 - 2(连续页不是固定的,索引不能直接 - 2)
                结束页 = 当前页 - 取整(连续页/2)  start = pageNo - parseInt(continues / 2);

            3)起始页小于1
                起始页 = 1    
                结束页 = 连续页

            4)结束页大于总页
                起始页 = 1    
                结束页 = 总页

      */
      const { continues, totalPage, pageNo } = this;
      let start = 0,
        end = 0;
      // 总页数小于连续页数
      if (continues > totalPage) {
        start = 1;
        end = totalPage;
      } else {
        // 正常情况
        start = pageNo - parseInt(continues / 2);
        end = pageNo + parseInt(continues / 2);
        if (start < 1) {
          start = 1;
          end = continues;
        }
        if (end > totalPage) {
          start = totalPage - continues + 1;
          end = totalPage;
        }
      }
      return { start, end };
    },
  },
  methods: {
    // 触发自定义事件 传当前页码
    setTotal(pageNo) {
      this.$emit("getPageNo", pageNo);
    },
  },
};
</script>

父组件给子组件传入参数

传入的参数:当前页码、每页数据条数、总数据条数、连续页码数

<!-- 分页 -->
<Pagination
   :pageNo="searchParams.pageNo"
   :pageSize="searchParams.pageSize"
   :total="total"
   :continues="5"
   @getPageNo="getPageNo"
></Pagination>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值