BasicTable.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <template>
  2. <div class="basic-table">
  3. <el-table
  4. v-bind="props.tableConfig"
  5. v-loading="props.tableConfig.loading"
  6. :data="props.tableData"
  7. @selection-change="handleSelectionChange"
  8. >
  9. <template #empty>
  10. <img :src="EmptyImg" alt="empty" />
  11. <span>{{ props.tableConfig.emptyText }}</span>
  12. </template>
  13. <el-table-column
  14. v-for="column in props.tableConfig.columns"
  15. :key="column.prop"
  16. v-bind="column"
  17. :prop="column.prop"
  18. :label="column.label"
  19. >
  20. <template #default="scope">
  21. <Render v-if="column.render" :render="column.render" :row="scope.row" />
  22. <slot v-else-if="column.slot" :name="column.slot" :row="scope.row" />
  23. </template>
  24. </el-table-column>
  25. </el-table>
  26. <el-pagination
  27. v-if="props.tableConfig.pagination && props.tableData.length > 0"
  28. :current-page="props.tableConfig.pagination.pageNumber"
  29. :page-size="props.tableConfig.pagination.pageSize"
  30. :page-sizes="PAGE_SIZE_CONFIG"
  31. layout="prev, pager, next, jumper, sizes, total"
  32. background
  33. :total="props.tableConfig.pagination.total"
  34. @size-change="handleSizeChange"
  35. @current-change="handleCurrentChange"
  36. />
  37. </div>
  38. </template>
  39. <script lang="ts" setup>
  40. import { ref } from 'vue';
  41. import type { BasicTableProps } from '@/types/basic-table';
  42. import { PAGE_SIZE_CONFIG } from '@/constant/pagination';
  43. import EmptyImg from 'assets/images/empty@1X.png';
  44. const selectedIds = ref<number[]>([]);
  45. const props = defineProps<{
  46. tableConfig: BasicTableProps;
  47. tableData: any[];
  48. }>();
  49. const emits = defineEmits<{
  50. (e: 'update:pageSize', value: number): void;
  51. (e: 'update:pageNumber', value: number): void;
  52. (e: 'update:selection', value: any[]): void;
  53. }>();
  54. const handleSizeChange = (value: number) => {
  55. emits('update:pageSize', value);
  56. };
  57. const handleCurrentChange = (value: number) => {
  58. emits('update:pageNumber', value);
  59. };
  60. const handleSelectionChange = (selection: any[]) => {
  61. selectedIds.value = selection.map((item) => item.id);
  62. emits('update:selection', selection);
  63. };
  64. defineExpose({
  65. selectedIds,
  66. });
  67. </script>
  68. <style lang="scss" scoped>
  69. .basic-table {
  70. width: 100%;
  71. height: 100%;
  72. }
  73. .el-table {
  74. width: 100%;
  75. }
  76. :deep(.el-table th),
  77. :deep(.el-table.is-scrolling-none th.el-table-fixed-column--left),
  78. :deep(.el-table.is-scrolling-none th.el-table-fixed-column--right) {
  79. color: rgba($text-color, 0.85);
  80. background-color: #fafafa !important;
  81. }
  82. :deep(.el-table td) {
  83. color: rgba($text-color, 0.65);
  84. border: none;
  85. padding: 16cpx;
  86. }
  87. .el-pagination {
  88. position: absolute;
  89. bottom: 30cpx;
  90. right: 40cpx;
  91. }
  92. :deep(.el-loading-mask) {
  93. background-color: rgba(0, 0, 0, 0.05);
  94. }
  95. :deep(.el-table--fit .el-table__inner-wrapper:before) {
  96. height: 0;
  97. }
  98. :deep(.el-table__empty-text) {
  99. @include flex-center;
  100. flex-direction: column;
  101. img {
  102. width: 510cpx;
  103. }
  104. }
  105. </style>