自定义分页控件,只显示当前页码的前后N页

复制代码
<template>
  <div
    class="pager-cn"
    v-if="total>0"
  >
    <span
      class="page-btn pre-btn"
      :class="{ 'disabled-btn': pageList.currentPage == 1 }"
      @click="onPrePage"
    >
      <i aria-label="图标: left"><svg
          viewBox="64 64 896 896"
          data-icon="left"
          width="1em"
          height="1em"
          fill="currentColor"
          aria-hidden="true"
          focusable="false"
          class=""
        >
          <path d="M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 0 0 0 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z"></path>
        </svg></i></span>
    <ul class="page-list">
      <li
        class="page-btn"
        :class="{ 'selected-page': page == pageList.currentPage }"
        v-for="(page, index) in pageList.list"
        :key="index"
        @click="onChangePage(page)"
      >
        <span>{{ page }}</span>
      </li>
    </ul>
    <span
      class="page-btn next-btn"
      :class="{ 'disabled-btn': pageList.currentPage == pageList.totalPage }"
      @click="onNextPage"
    ><i aria-label="图标: right"><svg
          viewBox="64 64 896 896"
          data-icon="right"
          width="1em"
          height="1em"
          fill="currentColor"
          aria-hidden="true"
          focusable="false"
          class=""
        >
          <path d="M765.7 486.8L314.9 134.7A7.97 7.97 0 0 0 302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 0 0 0-50.4z"></path>
        </svg></i></span>
  </div>
</template>
<script>
export default {
  name: "",
  props: {
    // 当前页码
    currentPage: {
      type: Number,
      default: 1,
    },
    // 总条数
    total: {
      type: Number,
      default: 0,
    },
    // 分页器每行最多显示多个页签
    pageRowNumber: {
      type: Number,
      default: 10,
    },
  },
  components: {},
  data() {
    return {
      pageList: {
        list: [],
        currentPage: 1, // 当前页码
        pageSize: 10, // 每页显示条数
        totalPage: 0, // 总页数
        total: 0, // 总条数
        pageRowNumber: 10, // 分页器显示的页码数量
      },
    };
  },
  watch: {
    pageRowNumber: {
      handler(value) {
        this.pageList.pageRowNumber = value;
      },
      immediate: true
    },
    total: {
      handler(value) {
        this.pageList.total = value;
        // 计算总页数
        this.pageList.totalPage = Math.ceil(value / this.pageList.pageSize);
        console.log("this.pageList.totalPage", this.pageList.totalPage);
        this.handleCurrent(1);
      },
      immediate: true
    },
    currentPage: {
      handler(value) {
        this.handleCurrent(value);
      },
      immediate: true
    },
  },
  computed: {},
  created() {},
  methods: {
    onPrePage() {
      if (this.pageList.currentPage === 1) {
        return;
      }
      this.$emit("pageChange", this.pageList.currentPage - 1);
    },
    onNextPage() {
      if (this.pageList.currentPage === this.pageList.totalPage) {
        return;
      }
      console.log(this.pageList.currentPage);
      this.$emit("pageChange", this.pageList.currentPage + 1);
    },
    onChangePage(page) {
      if (page === this.pageList.currentPage) {
        return;
      }
      this.$emit("pageChange", page);
    },
    handleCurrent(value) {
      this.pageList.currentPage = value;
      this.pageList.list = [];
      // 总页数小于等于每行显示的页码数量时,直接显示所有页码
      if (this.pageList.totalPage <= this.pageList.pageRowNumber) {
        console.log("直接显示所有页码", this.pageList.totalPage, this.total);
        for (let i = 1; i <= this.pageList.totalPage; i++) {
          this.pageList.list.push(i);
        }
      } else {
        // 当前页码小于等于每行显示的页码数量的一半时,显示前{ pageRowNumber }页
        if (value <= Math.floor(this.pageList.pageRowNumber / 2)) {
          for (let i = 1; i <= this.pageList.pageRowNumber; i++) {
            this.pageList.list.push(i);
          }
        }
        // 当前页码大于总页数减去每行显示的页码数量的一半时,显示后{ pageRowNumber }页
        else if (
          value >
          this.pageList.totalPage - Math.floor(this.pageList.pageRowNumber / 2)
        ) {
          for (
            let i = this.pageList.totalPage;
            i > this.pageList.totalPage - this.pageList.pageRowNumber;
            i--
          ) {
            this.pageList.list.unshift(i);
          }
        }
        // 当前页码在中间时,显示当前页的前后{ pageRowNumber }页
        else {
          // 每行显示的数量为奇数时
          if (this.pageList.pageRowNumber % 2 === 0) {
            for (
              let i =
                this.pageList.currentPage -
                Math.floor(this.pageList.pageRowNumber / 2);
              i <
              this.pageList.currentPage +
                Math.floor(this.pageList.pageRowNumber / 2);
              i++
            ) {
              this.pageList.list.push(i);
            }
          }
          // 每行显示的数量为偶数时
          else {
            for (
              let i =
                this.pageList.currentPage -
                Math.floor(this.pageList.pageRowNumber / 2);
              i <=
              this.pageList.currentPage +
                Math.floor(this.pageList.pageRowNumber / 2);
              i++
            ) {
              this.pageList.list.push(i);
            }
          }
        }
      }
    },
  },
};
</script>
<style lang="less" scoped>
.pager-cn {
  margin: 10px auto 0;
  text-align: center;

  .page-btn {
    font-size: 12px;
    display: inline-block;
    text-align: center;
    user-select: none;
    cursor: pointer;
    padding: 0 6px;

    min-width: 32px;
    height: 32px;
    font-family: Arial;
    line-height: 30px;
    text-align: center;
    vertical-align: middle;
    list-style: none;
    background-color: #fff;
    border: 1px solid #e8eaf2;
    border-radius: 0px;
    outline: 0;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;

    &.selected-page,
    &:hover {
      font-weight: 500;
      background: #fff;
      border-color: #6176ff;
      color: #8a9dff;
    }
  }

  .pre-btn,
  .next-btn {
    min-width: 28px;
  }

  .disabled-btn,
  .disabled-btn:hover {
    color: #e8eaf2;
    border-color: #e8eaf2;
  }

  .page-list {
    margin: 0 6px;
    display: inline-block;

    .page-btn {
      margin-right: 6px;
    }

    .page-btn:last-child {
      margin-right: 0;
    }
  }
}
</style>

效果如下

相关推荐
楼田莉子2 小时前
vscode搭建C/C++配置开发环境
c语言·开发语言·c++·vscode·学习·编辑器
我要精通C++2 小时前
lua虚拟机的垃圾回收机制
java·开发语言
22jimmy2 小时前
MyBatis动态sql
java·开发语言·mybatis
gerrgwg3 小时前
React Hooks入门
前端·javascript·react.js
ObjectX前端实验室3 小时前
【react18原理探究实践】调度机制之注册任务
前端·react.js
那我掉的头发算什么3 小时前
【数据结构】双向链表
java·开发语言·数据结构·链表·intellij-idea·idea
拾光Ծ3 小时前
【C++】STL之list模拟实现:关于链表容器的双向迭代器你知道多少?
开发语言·数据结构·c++·list·visual studio
666HZ6663 小时前
Java Stream流
java·开发语言
汉字萌萌哒3 小时前
【 HTML基础知识】
前端·javascript·windows