BasicTable.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. width: 100%;
  72. height: 100%;
  73. }
  74. .el-table {
  75. width: 100%;
  76. }
  77. :deep(.el-table th),
  78. :deep(.el-table.is-scrolling-none th.el-table-fixed-column--left),
  79. :deep(.el-table.is-scrolling-none th.el-table-fixed-column--right) {
  80. font-size: 14cpx;
  81. color: rgba($text-color, 0.85);
  82. background-color: #fafafa !important;
  83. }
  84. :deep(.el-table td) {
  85. font-size: 14cpx;
  86. color: rgba($text-color, 0.65);
  87. border: none;
  88. padding: 16cpx;
  89. }
  90. .el-pagination {
  91. position: absolute;
  92. bottom: 30cpx;
  93. right: 40cpx;
  94. }
  95. :deep(.el-loading-mask) {
  96. background-color: rgba(0, 0, 0, 0.05);
  97. }
  98. :deep(.el-table--fit .el-table__inner-wrapper:before) {
  99. height: 0;
  100. }
  101. :deep(.el-table__empty-text) {
  102. @include flex-center;
  103. flex-direction: column;
  104. img {
  105. width: 510cpx;
  106. }
  107. }
  108. </style>