The pagination component encapsulated in this article is primarily based on ElementUi’s El-Pagination, which adds page scrolling to the table header during page switching.

Import Pagination from ‘@/components/Pagination’

Components: {Pagination},

3. Use components

<pagination

      v-show="total>0"

      :total="total"

      :page.sync="listQuery.pageIndex"

      :limit.sync="listQuery.limit"

      @pagination="getList('')"

    />
Copy the code

@/components/Pagination/index.vue

<template>

  <div :class="{'hidden':hidden}" class="pagination-container">

    <el-pagination

      :background="background"

      :current-page.sync="currentPage"

      :page-size.sync="pageSize"

      :layout="layout"

      :page-sizes="pageSizes"

      :total="total"

      v-bind="$attrs"

      @size-change="handleSizeChange"

      @current-change="handleCurrentChange"

    />

  </div>

</template>

\


<script>

import { scrollTo } from '@/utils/common/scroll-to'

\


export default {

  name: 'Pagination',

  props: {

    total: {

      required: true,

      type: Number

    },

    page: {

      type: Number,

      default: 1

    },

    limit: {

      type: Number,

      default: 10

    },

    pageSizes: {

      type: Array,

      default() {

        return [10, 20, 30, 50]

      }

    },

    layout: {

      type: String,

      default: 'total, sizes, prev, pager, next, jumper'

    },

    background: {

      type: Boolean,

      default: true

    },

    autoScroll: {

      type: Boolean,

      default: true

    },

    hidden: {

      type: Boolean,

      default: false

    }

  },

  computed: {

    currentPage: {

      get() {

        return this.page

      },

      set(val) {

        this.$emit('update:page', val)

      }

    },

    pageSize: {

      get() {

        return this.limit

      },

      set(val) {

        this.$emit('update:limit', val)

      }

    }

  },

  methods: {

    handleSizeChange(val) {

      this.$emit('pagination', { page: this.currentPage, limit: val })

      if (this.autoScroll) {

        scrollTo(0, 800)

      }

    },

    handleCurrentChange(val) {

      this.$emit('pagination', { page: val, limit: this.pageSize })

      if (this.autoScroll) {

        scrollTo(0, 800)

      }

    }

  }

}

</script>

\


<style scoped>

.pagination-container {

  background: #fff;

  padding: 32px 16px;

}

.pagination-container.hidden {

  display: none;

}

</style>

\
Copy the code

scroll-to.js

Math.easeInOutQuad = function(t, b, c, d) {

  t /= d / 2

  if (t < 1) {

    return c / 2 * t * t + b

  }

  t--

  return -c / 2 * (t * (t - 2) - 1) + b

}

\


// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts

var requestAnimFrame = (function() {

  return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) }

})()

\


/**

 * Because it's so fucking difficult to detect the scrolling element, just move them all

 * @param {number} amount

 */

function move(amount) {

  document.documentElement.scrollTop = amount

  document.body.parentNode.scrollTop = amount

  document.body.scrollTop = amount

}

\


function position() {

  return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop

}

\


/**

 * @param {number} to

 * @param {number} duration

 * @param {Function} callback

 */

export function scrollTo(to, duration, callback) {

  const start = position()

  const change = to - start

  const increment = 20

  let currentTime = 0

  duration = (typeof (duration) === 'undefined') ? 500 : duration

  var animateScroll = function() {

    // increment the time

    currentTime += increment

    // find the value with the quadratic in-out easing function

    var val = Math.easeInOutQuad(currentTime, start, change, duration)

    // move the document.body

    move(val)

    // do the animation unless its over

    if (currentTime < duration) {

      requestAnimFrame(animateScroll)

    } else {

      if (callback && typeof (callback) === 'function') {

        // the animation is done so lets callback

        callback()

      }

    }

  }

  animateScroll()

}

\
Copy the code