Vue中实现分页

1.构造分页组件,并注册为全局组件

<template>
    <div class="pagination">
      <button v-if="startNumAndEndNum.start>1" @click="$emit('getPageNo',pageNo-1)">上一页</button>
      <button v-if="startNumAndEndNum.start>1" @click="$emit('getPageNo',1)" :class="{active:pageNo==1}">1</button>
      <button v-if="startNumAndEndNum.start>2">···</button>
        <!-- 中间部分 -->
      <template  v-for="(page,index) in startNumAndEndNum.end">
        <button
        :key="index" 
        v-if="startNumAndEndNum.start<=page"
        @click="$emit('getPageNo',page)"
        :class="{active:pageNo==page}"
        > 
        {{page}}
        </button>
       </template>  

      
      <button v-if="startNumAndEndNum.end<allPage-1">···</button>
      <button v-if="startNumAndEndNum.end<allPage" @click="$emit('getPageNo',allPage)" :class="{active:pageNo==allPage}">{{allPage}}</button>
      <button v-if="startNumAndEndNum.end!=allPage" @click="$emit('getPageNo',pageNo+1)">下一页</button>
      
      <button style="margin-left: 30px">共 {{total}} 条</button>
    </div>
  </template>
  
  <script>
    export default {
      name: "Page",
      props:['pageNo','pageSize','total','continues'],
      computed:{
        //计算总页数
        allPage(){
            //向上取整
            return Math.ceil(this.total / this.pageSize)
        },
        //计算 连续页码 起始数据和结束数据[连续页码至少是5]
        startNumAndEndNum(){
            //先定义两个变量存储开始与结束的数字
            let start=0,end=0;
            //如果数据不够5页(不正常现象)
            if(this.allPage<this.continues){
                start=1,
                end=this.allPage
            }else{
                start=this.pageNo - parseInt(this.continues/2),
                end=this.pageNo + parseInt(this.continues/2)
                //当当前页为1时 start为-1 
                if(start<1){
                    start=1,
                    end=this.continues
                }
                //纠正end 
                if(end>this.allPage){
                    end=this.allPage,
                    start=end-this.continues + 1
                }
                
            }
            return {start,end}
        }

      }
    }
  </script>
  
  <style lang="less" scoped>
    .pagination {
      text-align: center;
      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;
        }
      }
    //   button:active {
    //     color: rgba(235, 217, 55, 0.935);
    //     border: 1px solid orange;
    // }
    .active{
      background-color: skyblue;
    }
    }
  </style>

2.使用分页组件

<template>
  <div>
          <!-- 分页组件 -->
          <Page 
          :pageNo="params.pageNo" 
          :pageSize="params.pageSize" 
          :total="total" 
          :continues="5"
          ref="pg"
          ></Page>
  </div>
</template>

<script>
import {mapState} from "vuex";
export default {
  name: "Search",
  data() {
    return {
      params: {
        //分页器参数
        pageNo: 1,
        pageSize: 10,
      },
    };
  },
  mounted() {
    this.$refs.pg.$on('getPageNo',(pageNo)=>{
        this.params.pageNo=pageNo
        this.getSearch(this.params)
      })
  },
  computed: {
    //获取search模块展示的总数据条数
    ...mapState({
      total:state=>state.search.searchList.total
    })
  },
  methods: {
    //向服务器发请求获取search模块数据,根据参数不同返回不同的数据
    //把这次请求封装成函数,需要时候调用即可
    getSearch(params) {
      this.$store.dispatch("SearchInfo", params);
    },
};
</script>

<style lang="less" scoped>
</style>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue 实现分页通常需要以下几个步骤: 1. 定义分页组件的基本结构,包括页码、上一页、下一页等元素。 2. 定义分页组件的属性,包括当前页码、每页显示的数据条数、总数据条数等。 3. 定义分页组件的方法,包括计算总页数、生成页码列表等。 4. 在页面使用分页组件,并传入相应的属性和方法。 下面是一个简单的 Vue 分页组件实现示例: ```html <template> <div class="pagination"> <ul> <li v-if="currentPage > 1" @click="prevPage"><a href="#">上一页</a></li> <li v-for="page in pages" :class="{ active: page === currentPage }" @click="gotoPage(page)"><a href="#">{{ page }}</a></li> <li v-if="currentPage < pageCount" @click="nextPage"><a href="#">下一页</a></li> </ul> </div> </template> <script> export default { props: { currentPage: { type: Number, default: 1 }, pageSize: { type: Number, default: 10 }, total: { type: Number, default: 0 } }, computed: { // 计算总页数 pageCount() { return Math.ceil(this.total / this.pageSize); }, // 生成页码列表 pages() { const pages = []; for (let i = 1; i <= this.pageCount; i++) { pages.push(i); } return pages; } }, methods: { // 上一页 prevPage() { this.$emit('page-change', this.currentPage - 1); }, // 下一页 nextPage() { this.$emit('page-change', this.currentPage + 1); }, // 跳转到指定页码 gotoPage(page) { this.$emit('page-change', page); } } }; </script> ``` 在上面的代码,我们定义了一个名为 `pagination` 的分页组件,它接受三个属性:`currentPage` 表示当前页码,`pageSize` 表示每页显示的数据条数,`total` 表示总数据条数。我们通过计算属性 `pageCount` 计算总页数,并通过 `pages` 方法生成页码列表。在点击上一页、下一页或页码时,我们触发相应的方法,通过 `$emit` 事件传递页码给父组件进行数据请求。在父组件,我们可以通过监听 `page-change` 事件来实现分页查询数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

龙城桥少

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

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

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

打赏作者

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

抵扣说明:

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

余额充值