BasicTable.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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="props.pageSizeConfig || 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. pageSizeConfig?: number[];
  49. }>();
  50. const emits = defineEmits<{
  51. (e: 'update:pageSize', value: number): void;
  52. (e: 'update:pageNumber', value: number): void;
  53. (e: 'update:selection', value: any[]): void;
  54. }>();
  55. const handleSizeChange = (value: number) => {
  56. emits('update:pageSize', value);
  57. };
  58. const handleCurrentChange = (value: number) => {
  59. emits('update:pageNumber', value);
  60. };
  61. const handleSelectionChange = (selection: any[]) => {
  62. selectedIds.value = selection.map((item) => item.id);
  63. emits('update:selection', selection);
  64. };
  65. defineExpose({
  66. selectedIds,
  67. });
  68. </script>
  69. <style lang="scss" scoped>
  70. .basic-table {
  71. display: flex;
  72. flex-direction: column;
  73. gap: 20cpx;
  74. width: 100%;
  75. height: 100%;
  76. }
  77. .el-table {
  78. width: 100%;
  79. }
  80. :deep(.el-table th),
  81. :deep(.el-table.is-scrolling-none th.el-table-fixed-column--left),
  82. :deep(.el-table.is-scrolling-none th.el-table-fixed-column--right) {
  83. font-size: 14cpx;
  84. color: rgba($text-color, 0.85);
  85. background-color: #fafafa !important;
  86. }
  87. :deep(.el-table td) {
  88. font-size: 14cpx;
  89. color: rgba($text-color, 0.65);
  90. border: none;
  91. padding: 16cpx;
  92. }
  93. .el-pagination {
  94. display: flex;
  95. justify-content: flex-end;
  96. :deep(.btn-prev),
  97. :deep(.btn-next),
  98. :deep(.el-pager li) {
  99. width: 32cpx;
  100. height: 32cpx;
  101. }
  102. :deep(.el-pager li),
  103. :deep(.el-pagination__jump),
  104. :deep(.el-pagination__total),
  105. :deep(.el-input__wrapper),
  106. :deep(.el-select__wrapper),
  107. :deep(.el-select__suffix) {
  108. font-size: 14cpx;
  109. }
  110. :deep(.el-input__wrapper) {
  111. padding: 1cpx 11cpx;
  112. }
  113. :deep(.el-select__wrapper) {
  114. padding: 4cpx 12cpx;
  115. }
  116. :deep(.el-input__inner){
  117. width: 34cpx;
  118. height: 30cpx;
  119. }
  120. }
  121. :deep(.el-loading-mask) {
  122. background-color: rgba(0, 0, 0, 0.05);
  123. }
  124. :deep(.el-table--fit .el-table__inner-wrapper:before) {
  125. height: 0;
  126. }
  127. :deep(.el-table__empty-text) {
  128. @include flex-center;
  129. flex-direction: column;
  130. img {
  131. width: 510cpx;
  132. }
  133. }
  134. </style>