nuxtjs分页插件 适用于SEO优化

admin

最后编辑于 2024-09-28 01:10 阅读 61

使用说明:


<nuxt-Pagination :page-size="pageSize"
                     :current-page="current"
                     :total="total"
                     :type="type"
                     v-if="count > 1">
</nuxt-Pagination>

参数说明:

pageSize------每页显示多少条(默认10条)

current-------当前页码(默认第1页)

total---------总条数

count---------共多少页

type----------对应query中的分类type


实现思路:

1、总页数 count <= 11时

[1,2,3,4,5,6,7,8,9,10,count]

2、总页数 count > 11时

# 如果当前页数 currentPage < = 6

 [1,2,3,4,5,6,7,8,9,10,...,count] --------------- 前边共10个

   

# 如果当前页数 currentPage > 6

#   如果当前页数 currentPage + 5 < count

   [1,...,3,4,5,6,7,8,9,10,11,...,13]  -------- 中间共9个,当前页前后各4个

#   如果当前页数 currentPage + 5 >= count

   [1,...,3,4,5,6,7,8,9,10,11,12] ------------- 最后共10个


代码实现

Pagination.vue

<template>
    <div class="m-pagesBox">
      <nuxt-link class="prev"
                 :disabled="currentPage<=1"
                 tag="button"
                 :to="{path: '/',query:{page:currentPage-1,type:type}}">
        <i class="iconfont myhr-backward"></i>
      </nuxt-link>
      <div class="pages" v-if="count<=11">
        <nuxt-link v-for="item in count"
                   :key="item"
                   :class="currentPage===item?'active':''"
                   :to="{path: '/',query:{page:item,type:type}}">{{item}}</nuxt-link>
      </div>
      <div class="pages" v-else>
        <template v-if="currentPage <= 6">
          <nuxt-link v-for="item in 10"
                     :key="item"
                     :class="currentPage===item?'active':''"
                     :to="{path: '/',query:{page:item,type:type}}">{{item}}</nuxt-link>
          <nuxt-link :to="{path: '/',query:{page:currentPage+9>count?count:currentPage+9,type:type}}">...</nuxt-link>
          <nuxt-link v-if="count>11" :to="{path: '/',query:{page:count,type:type}}">{{count}}</nuxt-link>
        </template>
        <template v-else>
          <nuxt-link :to="{path: '/',query:{page:'1',type:type}}">1</nuxt-link>
          <nuxt-link :to="{path: '/',query:{page:currentPage-9<1?1:currentPage-9,type:type}}">...</nuxt-link>
          <template v-if="currentPage + 5 < count">
            <nuxt-link v-for="item in getArr(currentPage-4,currentPage)"
                       :key="item"
                       :to="{path: '/',query:{page:item,type:type}}">{{item}}</nuxt-link>
            <nuxt-link v-for="item in getArr(currentPage+1,currentPage+4)"
                       :key="item"
                       :class="currentPage===item?'active':''"
                       :to="{path: '/',query:{page:item,type:type}}">{{item}}</nuxt-link>
            <nuxt-link :to="{path: '/',query:{page:currentPage+9>count?count:currentPage+9,type:type}}">...</nuxt-link>
            <nuxt-link :to="{path: '/',query:{page:count,type:type}}">{{count}}</nuxt-link>
          </template>
          <template v-else>
            <nuxt-link v-for="item in getArr(count-9,count)"
                       :key="item"
                       :class="currentPage===item?'active':''"
                       :to="{path: '/',query:{page:item,type:type}}">{{item}}</nuxt-link>
          </template>
        </template>
      </div>
      <nuxt-link class="next"
                :disabled="currentPage===count"
                 tag="button"
                 :to="{path: '/',query:{page:currentPage+1,type:type}}">
        <i class="iconfont myhr-forward"></i>
      </nuxt-link>
    </div>
</template>

<script>
  export default {
    name: 'NuxtPagination',
    props: {
      pageSize: {
        type: Number,
        default: 10
      },
      currentPage:{
        type:Number,
        default: 1
      },
      total:{
        type:Number
      },
      type: {
        type: String,
        value: ''
      }
    },
    computed:{
      count(){
        return Math.ceil(this.total/this.pageSize);
      }
    },
    methods:{
      getArr(firstNum,lastNum){
        let arr=[];
        for(let i=firstNum;i<=lastNum;i++){
          arr.push(i);
        }
        return arr;
      }
    }
  }
</script>

<style lang="scss" scoped>
$textColor: #963fb1;
$fontSize: 13px;

@mixin btnStyle() {
  display: inline-block;
  min-width: 35.5px;
  height: 28px;
  line-height: 28px;
  background: #fff;
  border:none;
  color:#303133;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}

.m-pagesBox{
  .prev,.next{
    outline:none;
    padding: 0 6px;
    @include btnStyle();
    i{
      font-size: 12px;
    }
    &:hover{
      cursor: pointer;
      color:$textColor;
    }
    &:disabled{
      color:#c0c4cc;
      cursor: not-allowed;
    }
  }
  .pages{
    display: inline-block;
    a{
      margin: 0;
      padding: 0 4px;
      font-size: $fontSize;
      text-align: center;
      font-weight: bold;
      @include btnStyle();
      &:hover,&.active{
        cursor: pointer;
        color:$textColor;
      }
    }
  }
}
</style>


0 条评论