Pagination.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <template lang="pug">
  2. .pagenav
  3. b-pagination(
  4. v-if="total > 0"
  5. v-model="page"
  6. :total="total"
  7. :per-page="perPage"
  8. :range-before="isMobile ? 1 : 3"
  9. :range-after="isMobile ? 2 : 5"
  10. order="is-centered"
  11. aria-next-label="下一页"
  12. aria-previous-label="上一页"
  13. aria-page-label="页"
  14. aria-current-label="当前页"
  15. )
  16. b-pagination-button(
  17. slot-scope="props"
  18. :page="props.page"
  19. :id="`page${props.page.number}`"
  20. tag="router-link"
  21. :to="mergePagelink(props.page.number)"
  22. ) {{props.page.number}}
  23. b-pagination-button(
  24. slot="previous"
  25. slot-scope="props"
  26. :page="props.page"
  27. tag="router-link"
  28. :to="props.page.number ? mergePagelink(props.page.number) : '#'"
  29. )
  30. i.progico.progico-arrow.left
  31. b-pagination-button(
  32. slot="next"
  33. slot-scope="props"
  34. :page="props.page"
  35. tag="router-link"
  36. :to="props.page.number <= totalPage ? mergePagelink(props.page.number) : '#'"
  37. )
  38. i.progico.progico-arrow
  39. .hint-msg(v-else) 无相关解决方案
  40. </template>
  41. <script lang="ts">
  42. import Vue from 'vue'
  43. import qs from 'qs'
  44. export default Vue.extend({
  45. name: 'Pagination',
  46. components: {
  47. },
  48. props: {
  49. page: {
  50. type: Number,
  51. default: 1
  52. },
  53. querystring: {
  54. type: String,
  55. default: ''
  56. },
  57. list: Array,
  58. total: {
  59. type: Number,
  60. default: 0
  61. },
  62. perPage: {
  63. type: Number,
  64. default: 10
  65. },
  66. path: {
  67. type: String
  68. },
  69. mode: {
  70. type: String,
  71. default: 'params'
  72. }
  73. },
  74. data() {
  75. return {
  76. // @ts-ignore
  77. isMobile: this.$deviceType.isMobile()
  78. }
  79. },
  80. computed: {
  81. totalPage(): number {
  82. return Math.ceil(this.total / this.perPage)
  83. }
  84. },
  85. methods: {
  86. mergePagelink(page) {
  87. let path = this.path || this.$route.path
  88. const query = Object.assign({}, this.$route.query)
  89. if (this.mode === 'params') {
  90. path += page
  91. }
  92. else {
  93. query.page = page
  94. }
  95. return `${path}${Object.keys(query).length ? '?' + qs.stringify(query) : ''}`
  96. }
  97. }
  98. })
  99. </script>
  100. <style lang="scss">
  101. .kaifain-view {
  102. .pagenav {
  103. .hint-msg {
  104. text-align: center;
  105. font-size: 0.875rem;
  106. color: #999;
  107. padding: 2rem;
  108. }
  109. }
  110. .pagination {
  111. max-width: 720px;
  112. margin: 0 auto;
  113. justify-content: center;
  114. padding: 3rem 0;
  115. .pagination-previous {
  116. flex-grow: unset;
  117. order: 1;
  118. }
  119. .pagination-list {
  120. flex-grow: unset;
  121. order: 2;
  122. }
  123. .pagination-next {
  124. flex-grow: unset;
  125. order: 3;
  126. }
  127. .progico-arrow {
  128. font-size: 0.75em;
  129. &.left {
  130. transform: rotate(180deg);
  131. }
  132. }
  133. }
  134. }
  135. </style>