controlled-sort.vue 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. <template>
  2. <el-table-v2 v-model:sort-state="sortState" :columns="columns" :data="data" :width="700" :height="400" fixed @column-sort="onSort" />
  3. </template>
  4. <script lang="ts" setup>
  5. import { ref } from 'vue'
  6. import { TableV2SortOrder } from 'element-plus'
  7. import type { SortBy, SortState } from 'element-plus'
  8. const generateColumns = (length = 10, prefix = 'column-', props?: any) =>
  9. Array.from({ length }).map((_, columnIndex) => ({
  10. ...props,
  11. key: `${prefix}${columnIndex}`,
  12. dataKey: `${prefix}${columnIndex}`,
  13. title: `Column ${columnIndex}`,
  14. width: 150,
  15. }))
  16. const generateData = (columns: ReturnType<typeof generateColumns>, length = 200, prefix = 'row-') =>
  17. Array.from({ length }).map((_, rowIndex) => {
  18. return columns.reduce(
  19. (rowData, column, columnIndex) => {
  20. rowData[column.dataKey] = `Row ${rowIndex} - Col ${columnIndex}`
  21. return rowData
  22. },
  23. {
  24. id: `${prefix}${rowIndex}`,
  25. parentId: null,
  26. }
  27. )
  28. })
  29. const columns = generateColumns(10)
  30. const data = ref(generateData(columns, 200))
  31. columns[0].sortable = true
  32. columns[1].sortable = true
  33. const sortState = ref<SortState>({
  34. 'column-0': TableV2SortOrder.DESC,
  35. 'column-1': TableV2SortOrder.ASC,
  36. })
  37. const onSort = ({ key, order }: SortBy) => {
  38. sortState.value[key] = order
  39. data.value = data.value.reverse()
  40. }
  41. </script>