MajorTable.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <template>
  2. <div>
  3. <el-table ref="tableRef" :data="filteredData" height="100%" border v-loading="loading" @selection-change="handleSelectionChange">
  4. <el-table-column type="selection" width="50" align="center" :selectable="selectable"></el-table-column>
  5. <el-table-column label="方向名称" prop="name">
  6. <template #header>
  7. <el-input v-model="tempKeyword" placeholder="搜索专业" prefix-icon="Search" clearable @clear="handleQuery" @keyup.enter="handleQuery" />
  8. </template>
  9. <template #default="scope">
  10. <div class="flex items-center gap-x-2">
  11. <span class="font-bold">{{ scope.row.name }}</span>
  12. <span class="text-[#999] text-[12px]">{{ scope.row.ancestors }}</span>
  13. </div>
  14. </template>
  15. </el-table-column>
  16. </el-table>
  17. </div>
  18. </template>
  19. <script setup>
  20. import { getUniversityMajorList } from '@/api/front/university';
  21. import { nextTick } from 'vue';
  22. const props = defineProps({
  23. universityId: {
  24. type: Number,
  25. default: null,
  26. },
  27. expanded: {
  28. type: Boolean,
  29. default: false,
  30. },
  31. selection: {
  32. type: Array,
  33. default: () => [],
  34. }
  35. });
  36. const data = ref([]);
  37. const selectedRows = ref([]);
  38. const tableRef = ref(null);
  39. const filteredData = computed(() => {
  40. return data.value.filter(item => item.name.includes(keyword.value));
  41. });
  42. const keyword = ref('');
  43. const tempKeyword = ref('');
  44. const loading = ref(false);
  45. const selectable = (row) => {
  46. if (props.selection.length < 3) {
  47. return true;
  48. }
  49. const hasSelected = selectedRows.value.map(item => item.id).includes(row.id);
  50. return hasSelected;
  51. }
  52. const emit = defineEmits(['selection-change']);
  53. const handleSelectionChange = (selection) => {
  54. selectedRows.value = selection;
  55. emit('selection-change', selection);
  56. }
  57. const handleQuery = () => {
  58. keyword.value = tempKeyword.value;
  59. }
  60. const getList = () => {
  61. loading.value = true;
  62. getUniversityMajorList({
  63. universityId: props.universityId,
  64. }).then(res => {
  65. data.value = res.data;
  66. nextTick(() => {
  67. // 恢复选中状态:根据 props.selection 中的 id 找到对应的 row 并选中
  68. props.selection.forEach(selectedItem => {
  69. const row = data.value.find(dataItem => dataItem.id === selectedItem.majorId);
  70. if (row) {
  71. tableRef.value.toggleRowSelection(row, true);
  72. }
  73. });
  74. });
  75. }).finally(() => {
  76. loading.value = false;
  77. });
  78. }
  79. watch(() => props.expanded, (newVal) => {
  80. if (newVal && data.value.length === 0) {
  81. getList();
  82. }
  83. });
  84. </script>
  85. <style lang="scss" scoped>
  86. :deep(.el-table__header) {
  87. .el-checkbox {
  88. display: none;
  89. }
  90. }
  91. </style>