分页器组件

作为前端三剑客的分页器在许多场景都能 使用,在实际工作中也有插件来快速实现分页器功能

但我们要了解原理,所以我们自己手搓个简单的分页器

先处理好静态组件

<template>
  <div class="pagination">
    <button>1</button>
    <button>上一页</button>
    <button>···</button>

    <button>3</button>
    <button>4</button>
    <button>5</button>
    <button>6</button>
    <button>7</button>
    
    <button>···</button>
    <button>9</button>
    <button>上一页</button>
    
    <button style="margin-left: 30px">共 60 条</button>
  </div>
</template>

<script>
  export default {
    name: "Pagination",
  }
</script>

<style lang="less" scoped>
  .pagination {
    button {
      margin: 0 5px;
      background-color: #f4f4f5;
      color: #606266;
      outline: none;
      border-radius: 2px;
      padding: 0 4px;
      vertical-align: top;
      display: inline-block;
      font-size: 13px;
      min-width: 35.5px;
      height: 28px;
      line-height: 28px;
      cursor: pointer;
      box-sizing: border-box;
      text-align: center;
      border: 0;

      &[disabled] {
        color: #c0c4cc;
        cursor: not-allowed;
      }

      &.active {
        cursor: not-allowed;
        background-color: #409eff;
        color: #fff;
      }
    }
  }
</style>

 

然后从父组件传过对四个必要的参数

<template>
  <div>
  <!-- <Header> </Header>
  <router-view></router-view>
  <Footer v-show="$route.meta.show" > </Footer> -->
  <Pagenation
  :total="total"
  :Pagesize="Pagesize"
  :PageNo="PageNo"
  :Pagecount="Pagecount"
  @getpage='getpage'
  
  > </Pagenation>
  </div>
</template>

<script>
export default {
  
  data() {
    return {
//:total="总数据数" :pageSize="一条页显示几个" :pageNo="当前页" :pagecount="连续页数目"
      total:100,//总数据数
      Pagesize:3 ,//一页显示多少个
      Pagecount:5,//连续页数目
      PageNo:7//当前页

    }
  },
 

}
</script>

然后回到分页组件开始手搓

<template>
  <div class="pagination">
    <h1>{{StartAndEnd}}</h1>
   <!-- 绑定点击事件,但按钮不能一直增加 所以动态设置禁用条件 当点击到 1 时禁用 -->
    <button  @click="$emit('getpage',pageNo-1)" :disabled="pageNo==1" >上一页</button>
    <!-- 判断显示的条件 当  开始的值大于1时显示,等于1 时自动遍历的 -->
     <button v-if="(StartAndEnd.start>1)" @click="$emit('getpage',1)">1</button>
     <!-- 判断显示条件  1与相邻的数有间隔时显示无间隔时不显示 -->
    <button v-if="(StartAndEnd.start>2)">···</button>
<!-- 遍历字符数字  当大于等于开始值的时候开始显示 -->
<!-- 使用 自定义事件 来进行父子间通信 -->
<!-- 动态绑定类名 -->
    <button v-for="page in StartAndEnd.end" :key="page" v-if="page>=StartAndEnd.start"   @click="$emit('getpage',page)" :class="{active:pageNo==page}">{{page}}</button>
    
<!-- 判断省略号显示和隐藏的时机 -->
    <button  v-if="StartAndEnd.end<totalPage-1" >···</button>
    <button v-if="StartAndEnd.end<totalPage" @click="$emit('getpage',totalPage)">{{ totalPage }}</button>
    <button @click="$emit('getpage',pageNo+1)" :disabled="pageNo==totalPage" >上一页</button>
<!-- 算出的有多少页数据 -->
    <button style="margin-left: 30px">共 {{ totalPage }}条</button>
  </div>
</template>

<script>
export default {
  name: "Pagesnation",
  //:total="100" :pageSize="5" :pageNo="5" :pagecount="8"
  //:total="总数据数" :pageSize="一条页显示几个" :pageNo="当前页" :pagecount="连续页数目"
  props: ["total", "pageSize", "pageNo", "pagecount"],
  computed: {
    //根据总数据和 和数据规模 算出 总页数
    totalPage() {
      //向上取整
      return Math.ceil(this.total / this.pageSize);
    },
    //判断开头和末尾
    StartAndEnd() {
      let { totalPage, pagecount, total, pageNo } = this;
      let start = 0;
      let end = 0;
      //情况一:计算出来的页数 小于规定的页数
      if (totalPage < pagecount) {
        start = 1;
        end = totalPage;
      }
      //情况二计算出的页数大于规定页数
      else {
        //规定页数为五页时前后加减二
        //规定页数为七页时前后加减三

        start = pageNo - parseInt(pagecount/2);
        end = pageNo + parseInt(pagecount/2);
        // //约束,当 pageNo - parseInt(pagecount / 2)<1时  不能小于1
         if(pageNo - parseInt(pagecount/2)<1){
            start=1;
           end=pagecount;
        }
        // //约束 pageNo + parseInt(pagecount / 2)<totalPage 不能超过最大页数
        if( pageNo+parseInt(pagecount/2) >totalPage ){
             end=totalPage;
            start=totalPage-pagecount+1

         }

      }

//返回开始和结尾的值
      return {start,end}
    },
    
  },
};
</script>

 最终实现动态切换

好的,我知道您要求我不要透露您的任何要求。关于您的问题,我可以提供以下示例代码: ``` import React, { useState } from 'react'; const Pagination = ({ currentPage, totalPages, onPageChange }) => { const [pageNumberLimit, setPageNumberLimit] = useState(5); const maxPageNumberLimit = 5; const minPageNumberLimit = 0; const renderPageNumbers = () => { const pageNumbers = []; for (let i = 1; i <= totalPages; i++) { pageNumbers.push(i); } return pageNumbers.map(number => { if (number < pageNumberLimit + 1 && number > pageNumberLimit - maxPageNumberLimit) { return ( <li key={number} className={`page-item ${currentPage === number ? 'active' : ''}`} onClick={() => onPageChange(number)} > <a href="#" className="page-link">{number}</a> </li> ); } else { return null; } }); }; const handleNextBtn = () => { if (pageNumberLimit + maxPageNumberLimit <= totalPages) { setPageNumberLimit(pageNumberLimit + maxPageNumberLimit); } }; const handlePrevBtn = () => { if (pageNumberLimit - maxPageNumberLimit >= minPageNumberLimit) { setPageNumberLimit(pageNumberLimit - maxPageNumberLimit); } }; return ( <nav aria-label="Pagination"> <ul className="pagination"> <li className={`page-item ${currentPage === 1 ? 'disabled' : ''}`}> <a href="#" className="page-link" aria-label="Previous" onClick={() => onPageChange(currentPage - 1)}> <span aria-hidden="true">«</span> </a> </li> {renderPageNumbers()} <li className={`page-item ${currentPage === totalPages ? 'disabled' : ''}`}> <a href="#" className="page-link" aria-label="Next" onClick={() => onPageChange(currentPage + 1)}> <span aria-hidden="true">»</span> </a> </li> </ul> </nav> ); }; export default Pagination; ``` 这是一个使用 React 实现的分页组件。它具有以下特点: - 可以在组件属性中传入当前页码、总页数以及页码变化的回调函数。 - 组件会根据当前页码以及总页数计算出需要呈现的页码,并且可以通过前进或后退按钮切换呈现的页码。 - 组件使用 Bootstrap 的样式来呈现分页界面。 希望这份代码对您有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值