0
点赞
收藏
分享

微信扫一扫

手写分页器

凌得涂 2022-03-12 阅读 110

Vue项目手写page页码实现的方式原理
Search/index.vue

// 组件间传递数据(父给子)
<Pagination
  :pageNo='searchParams.pageNo'
  :pageSize='searchParams.pageSize'
  :total='total'
  :continues='5'
  :@getPageNo="getPageNo"
></Pagination>
// 使用映射mapState映射出total的总数据(数据来源于接口的数据)
// 引入mapState
import { mapGetters, mapState } from "vuex";
computed: {
    ...mapState({
      total: (state) => state.search.searchList.total,
    }),
  },
// 点击页码的自定义的事件
getPageNo(pageNo) {
   // 整理带给服务器的参数
   this.searchParams.pageNo = pageNo;
   this.getData();
  },

Pagination/index.vue

接收过来的数据以及相应的逻辑编写
<template>
  <div class="pagination">
    <!-- 前面部分 -->
    <button
      :disabled="pageNo==1"
      @click="transmitPageNo(pageNo)"
    >上一页</button>
    <button
      v-if="startNumAndEndNum.start> 1"
      @click="transmitPageNoOne(pageNo)"
      :class="{active:pageNo == 1}"
    >1</button>
    <button v-if="startNumAndEndNum.start > 2">···</button>

    <!-- 中间部分 -->
    <button
      v-for="(page,index) in startNumAndEndNum.end"
      :key="index"
      v-if="page >= startNumAndEndNum.start"
      @click="transmitPage(page)"
      :class="{active:pageNo == page}"
    >{{page}}</button>

    <!-- 后面部分 -->
    <button v-if="startNumAndEndNum.end < totalPage - 1">···</button>
    <button
      v-if="startNumAndEndNum.end < totalPage"
      @click="transmitTotalPage(totalPage)"
      :class="{active:pageNo == totalPage}"
    >{{totalPage}}</button>
    <button
      :disabled="pageNo == totalPage"
      @click="transmitPageNoTotalPage(pageNo)"
    >下一页</button>

    <button style="margin-left: 30px">{{total}}</button>
  </div>
</template>

<script>
export default {
  name: "Pagination",
  props: ["pageNo", "pageSize", "total", "continues"],
  computed: {
    // 总共多少页
    totalPage() {
      return Math.ceil(this.total / this.pageSize);
    },
    // 计算出连续的页码的起始数字与结束数字,(连续页码的数字至少是5页)
    startNumAndEndNum() {
      // 结构出当前页码,连续页码,总页数
      let { pageNo, continues, totalPage } = this;
      // 先定义两个变量存储起始数字与结束数字
      let start = 0;
      let end = 0;
      // 不正常现象(总页数没有连续页码多)
      if (continues > totalPage) {
        start = 1;
        end = totalPage;
      } else {
        // 正常现象(连续页码数是5,但是总页数一定大于连续页码数5)
        // 起始
        start = pageNo - parseInt(continues / 2);
        // 结束
        end = pageNo + parseInt(continues / 2);
        // 不正常现象(start数字出现0|负数) 纠正
        if (start < 1) {
          start = 1;
          end = continues;
        }
        // 不正常现象(end数字大于总页码数) 纠正
        if (end > totalPage) {
          end = totalPage;
          start = totalPage - continues + 1;
        }
      }
      return { start, end };
    },
  },
  methods: {
    // 以下是点击页码的自定义事件触发
    transmitPageNo(pageNo) {
      this.$emit("getPageNo", pageNo - 1);
    },
    transmitPageNoOne(pageNo) {
      this.$emit("getPageNo", 1);
    },
    transmitPage(page) {
      this.$emit("getPageNo", page);
    },
    transmitTotalPage(totalPage) {
      this.$emit("getPageNo", totalPage);
    },
    transmitPageNoTotalPage(pageNo) {
      this.$emit("getPageNo", pageNo + 1);
    },
  },
};
</script>

<style lang="less" scoped>
.pagination {
  text-align: center;
.active {
  background-color: skyblue;
}
</style>
举报

相关推荐

0 条评论