fixed-columns.vue 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. <template>
  2. <el-table-v2 :columns="columns" :data="data" :sort-by="sortBy" :width="700" :height="400" fixed @column-sort="onSort" />
  3. </template>
  4. <script lang="ts" setup>
  5. import { ref } from 'vue'
  6. import { TableV2FixedDir, TableV2SortOrder } from 'element-plus'
  7. import type { SortBy } 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. let data = generateData(columns, 200)
  31. columns[0].fixed = true
  32. columns[1].fixed = TableV2FixedDir.LEFT
  33. columns[9].fixed = TableV2FixedDir.RIGHT
  34. for (let i = 0; i < 3; i++) columns[i].sortable = true
  35. const sortBy = ref<SortBy>({
  36. key: 'column-0',
  37. order: TableV2SortOrder.ASC,
  38. })
  39. const onSort = (_sortBy: SortBy) => {
  40. data = data.reverse()
  41. sortBy.value = _sortBy
  42. }
  43. </script>