feature: add pagination component (#1213)
This commit is contained in:
		
							
								
								
									
										99
									
								
								src/components/Pagination/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								src/components/Pagination/index.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,99 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div :class="{'hidden':hidden}" class="pagination-container">
 | 
			
		||||
    <el-pagination
 | 
			
		||||
      :background="background"
 | 
			
		||||
      :current-page.sync="currentPage"
 | 
			
		||||
      :page-size.sync="pageSize"
 | 
			
		||||
      :layout="layout"
 | 
			
		||||
      :total="total"
 | 
			
		||||
      v-bind="$attrs"
 | 
			
		||||
      @size-change="handleSizeChange"
 | 
			
		||||
      @current-change="handleCurrentChange"/>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { scrollTo } from '@/utils/scrollTo'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'Pagination',
 | 
			
		||||
  props: {
 | 
			
		||||
    total: {
 | 
			
		||||
      required: true,
 | 
			
		||||
      type: Number
 | 
			
		||||
    },
 | 
			
		||||
    page: {
 | 
			
		||||
      type: Number,
 | 
			
		||||
      default: 1
 | 
			
		||||
    },
 | 
			
		||||
    limit: {
 | 
			
		||||
      type: Number,
 | 
			
		||||
      default: 20
 | 
			
		||||
    },
 | 
			
		||||
    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>
 | 
			
		||||
@@ -164,17 +164,6 @@ export function objectMerge(target, source) {
 | 
			
		||||
  return target
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function scrollTo(element, to, duration) {
 | 
			
		||||
  if (duration <= 0) return
 | 
			
		||||
  const difference = to - element.scrollTop
 | 
			
		||||
  const perTick = (difference / duration) * 10
 | 
			
		||||
  setTimeout(() => {
 | 
			
		||||
    element.scrollTop = element.scrollTop + perTick
 | 
			
		||||
    if (element.scrollTop === to) return
 | 
			
		||||
    scrollTo(element, to, duration - 10)
 | 
			
		||||
  }, 10)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function toggleClass(element, className) {
 | 
			
		||||
  if (!element || !className) {
 | 
			
		||||
    return
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										50
									
								
								src/utils/scrollTo.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/utils/scrollTo.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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()
 | 
			
		||||
}
 | 
			
		||||
@@ -50,26 +50,18 @@
 | 
			
		||||
      </el-table-column>
 | 
			
		||||
    </el-table>
 | 
			
		||||
 | 
			
		||||
    <div class="pagination-container">
 | 
			
		||||
      <el-pagination
 | 
			
		||||
        :current-page="listQuery.page"
 | 
			
		||||
        :page-sizes="[10,20,30, 50]"
 | 
			
		||||
        :page-size="listQuery.limit"
 | 
			
		||||
        :total="total"
 | 
			
		||||
        background
 | 
			
		||||
        layout="total, sizes, prev, pager, next, jumper"
 | 
			
		||||
        @size-change="handleSizeChange"
 | 
			
		||||
        @current-change="handleCurrentChange"/>
 | 
			
		||||
    </div>
 | 
			
		||||
    <pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" />
 | 
			
		||||
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { fetchList } from '@/api/article'
 | 
			
		||||
import Pagination from '@/components/Pagination' // Secondary package based on el-pagination
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'ArticleList',
 | 
			
		||||
  components: { Pagination },
 | 
			
		||||
  filters: {
 | 
			
		||||
    statusFilter(status) {
 | 
			
		||||
      const statusMap = {
 | 
			
		||||
 
 | 
			
		||||
@@ -80,9 +80,7 @@
 | 
			
		||||
      </el-table-column>
 | 
			
		||||
    </el-table>
 | 
			
		||||
 | 
			
		||||
    <div class="pagination-container">
 | 
			
		||||
      <el-pagination v-show="total>0" :current-page="listQuery.page" :page-sizes="[10,20,30, 50]" :page-size="listQuery.limit" :total="total" background layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" @current-change="handleCurrentChange"/>
 | 
			
		||||
    </div>
 | 
			
		||||
    <pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" />
 | 
			
		||||
 | 
			
		||||
    <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible">
 | 
			
		||||
      <el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="70px" style="width: 400px; margin-left:50px;">
 | 
			
		||||
@@ -130,8 +128,9 @@
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { fetchList, fetchPv, createArticle, updateArticle } from '@/api/article'
 | 
			
		||||
import waves from '@/directive/waves' // 水波纹指令
 | 
			
		||||
import waves from '@/directive/waves' // Waves directive
 | 
			
		||||
import { parseTime } from '@/utils'
 | 
			
		||||
import Pagination from '@/components/Pagination' // Secondary package based on el-pagination
 | 
			
		||||
 | 
			
		||||
const calendarTypeOptions = [
 | 
			
		||||
  { key: 'CN', display_name: 'China' },
 | 
			
		||||
@@ -148,9 +147,8 @@ const calendarTypeKeyValue = calendarTypeOptions.reduce((acc, cur) => {
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'ComplexTable',
 | 
			
		||||
  directives: {
 | 
			
		||||
    waves
 | 
			
		||||
  },
 | 
			
		||||
  components: { Pagination },
 | 
			
		||||
  directives: { waves },
 | 
			
		||||
  filters: {
 | 
			
		||||
    statusFilter(status) {
 | 
			
		||||
      const statusMap = {
 | 
			
		||||
@@ -168,7 +166,7 @@ export default {
 | 
			
		||||
    return {
 | 
			
		||||
      tableKey: 0,
 | 
			
		||||
      list: null,
 | 
			
		||||
      total: null,
 | 
			
		||||
      total: 0,
 | 
			
		||||
      listLoading: true,
 | 
			
		||||
      listQuery: {
 | 
			
		||||
        page: 1,
 | 
			
		||||
@@ -228,14 +226,6 @@ export default {
 | 
			
		||||
      this.listQuery.page = 1
 | 
			
		||||
      this.getList()
 | 
			
		||||
    },
 | 
			
		||||
    handleSizeChange(val) {
 | 
			
		||||
      this.listQuery.limit = val
 | 
			
		||||
      this.getList()
 | 
			
		||||
    },
 | 
			
		||||
    handleCurrentChange(val) {
 | 
			
		||||
      this.listQuery.page = val
 | 
			
		||||
      this.getList()
 | 
			
		||||
    },
 | 
			
		||||
    handleModifyStatus(row, status) {
 | 
			
		||||
      this.$message({
 | 
			
		||||
        message: '操作成功',
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user