index.vue 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <template>
  2. <m-card :shadow="shadow">
  3. <template v-if="cardTitle" slot="header">
  4. <span>{{ cardTitle }}</span>
  5. </template>
  6. <slot name="header"></slot>
  7. <el-table
  8. ref="table"
  9. :data="items"
  10. v-bind="$attrs"
  11. v-on="$listeners"
  12. >
  13. <template #append>
  14. <slot name="table-append"></slot>
  15. </template>
  16. <m-table-column
  17. v-for="(header, index) in headers"
  18. :key="(header.prop ?? header.label) || index"
  19. :item="header"
  20. >
  21. <template v-if="$scopedSlots[header.prop]" #[header.prop]="scope">
  22. <slot :name="header.prop" v-bind="scope"></slot>
  23. </template>
  24. <template v-if="$scopedSlots[`${header.prop}-header`]" #[`${header.prop}-header`]>
  25. <slot :name="`${header.prop}-header`"></slot>
  26. </template>
  27. </m-table-column>
  28. </el-table>
  29. <slot></slot>
  30. <div class="pt-3 text-right" v-if="total">
  31. <el-pagination
  32. @current-change="handleCurrentChange"
  33. :current-page="pageCurrent"
  34. background
  35. :page-size="pageSize"
  36. layout="total, prev, pager, next, jumper"
  37. :total="total"
  38. >
  39. </el-pagination>
  40. </div>
  41. </m-card>
  42. </template>
  43. <script>
  44. import MTableColumn from './MTableColumn.vue'
  45. export default {
  46. name: 'm-table',
  47. components: { MTableColumn },
  48. props: {
  49. cardTitle: String,
  50. shadow: String,
  51. items: {
  52. type: Array,
  53. default: () => []
  54. },
  55. headers: {
  56. type: Array,
  57. default: () => []
  58. },
  59. pageSize: {
  60. type: Number,
  61. default: 10
  62. },
  63. pageCurrent: {
  64. type: Number,
  65. default: 1
  66. },
  67. total: {
  68. type: Number,
  69. default: 0
  70. }
  71. },
  72. methods: {
  73. handleCurrentChange (val) {
  74. this.$emit('page-change', val)
  75. }
  76. }
  77. }
  78. </script>
  79. <style lang="scss" scoped>
  80. </style>