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
 | 
					  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) {
 | 
					export function toggleClass(element, className) {
 | 
				
			||||||
  if (!element || !className) {
 | 
					  if (!element || !className) {
 | 
				
			||||||
    return
 | 
					    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-column>
 | 
				
			||||||
    </el-table>
 | 
					    </el-table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <div class="pagination-container">
 | 
					    <pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" />
 | 
				
			||||||
      <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>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
import { fetchList } from '@/api/article'
 | 
					import { fetchList } from '@/api/article'
 | 
				
			||||||
 | 
					import Pagination from '@/components/Pagination' // Secondary package based on el-pagination
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
  name: 'ArticleList',
 | 
					  name: 'ArticleList',
 | 
				
			||||||
 | 
					  components: { Pagination },
 | 
				
			||||||
  filters: {
 | 
					  filters: {
 | 
				
			||||||
    statusFilter(status) {
 | 
					    statusFilter(status) {
 | 
				
			||||||
      const statusMap = {
 | 
					      const statusMap = {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -80,9 +80,7 @@
 | 
				
			|||||||
      </el-table-column>
 | 
					      </el-table-column>
 | 
				
			||||||
    </el-table>
 | 
					    </el-table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <div class="pagination-container">
 | 
					    <pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" />
 | 
				
			||||||
      <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>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible">
 | 
					    <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;">
 | 
					      <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>
 | 
					<script>
 | 
				
			||||||
import { fetchList, fetchPv, createArticle, updateArticle } from '@/api/article'
 | 
					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 { parseTime } from '@/utils'
 | 
				
			||||||
 | 
					import Pagination from '@/components/Pagination' // Secondary package based on el-pagination
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const calendarTypeOptions = [
 | 
					const calendarTypeOptions = [
 | 
				
			||||||
  { key: 'CN', display_name: 'China' },
 | 
					  { key: 'CN', display_name: 'China' },
 | 
				
			||||||
@@ -148,9 +147,8 @@ const calendarTypeKeyValue = calendarTypeOptions.reduce((acc, cur) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
  name: 'ComplexTable',
 | 
					  name: 'ComplexTable',
 | 
				
			||||||
  directives: {
 | 
					  components: { Pagination },
 | 
				
			||||||
    waves
 | 
					  directives: { waves },
 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  filters: {
 | 
					  filters: {
 | 
				
			||||||
    statusFilter(status) {
 | 
					    statusFilter(status) {
 | 
				
			||||||
      const statusMap = {
 | 
					      const statusMap = {
 | 
				
			||||||
@@ -168,7 +166,7 @@ export default {
 | 
				
			|||||||
    return {
 | 
					    return {
 | 
				
			||||||
      tableKey: 0,
 | 
					      tableKey: 0,
 | 
				
			||||||
      list: null,
 | 
					      list: null,
 | 
				
			||||||
      total: null,
 | 
					      total: 0,
 | 
				
			||||||
      listLoading: true,
 | 
					      listLoading: true,
 | 
				
			||||||
      listQuery: {
 | 
					      listQuery: {
 | 
				
			||||||
        page: 1,
 | 
					        page: 1,
 | 
				
			||||||
@@ -228,14 +226,6 @@ export default {
 | 
				
			|||||||
      this.listQuery.page = 1
 | 
					      this.listQuery.page = 1
 | 
				
			||||||
      this.getList()
 | 
					      this.getList()
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    handleSizeChange(val) {
 | 
					 | 
				
			||||||
      this.listQuery.limit = val
 | 
					 | 
				
			||||||
      this.getList()
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    handleCurrentChange(val) {
 | 
					 | 
				
			||||||
      this.listQuery.page = val
 | 
					 | 
				
			||||||
      this.getList()
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    handleModifyStatus(row, status) {
 | 
					    handleModifyStatus(row, status) {
 | 
				
			||||||
      this.$message({
 | 
					      this.$message({
 | 
				
			||||||
        message: '操作成功',
 | 
					        message: '操作成功',
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user