1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
  | <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" 
 |        :pager-count="pagerCount" 
 |        :total="total" 
 |        v-bind="$attrs" 
 |        @size-change="handleSizeChange" 
 |        @current-change="handleCurrentChange" 
 |      /> 
 |    </div> 
 |  </template> 
 |    
 |  <script> 
 |  import { scrollTo } from '@/utils/scroll-to' 
 |    
 |  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] 
 |        } 
 |      }, 
 |      // 移动端页码按钮的数量端默认值5 
 |      pagerCount: { 
 |        type: Number, 
 |        default: document.body.clientWidth < 992 ? 5 : 7 
 |      }, 
 |      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 
 |      } 
 |    }, 
 |    data() { 
 |      return { 
 |      }; 
 |    }, 
 |    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) { 
 |        if (this.currentPage * val > this.total) { 
 |          this.currentPage = 1 
 |        } 
 |        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> 
 |  
  |