fixed-columns.vue 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <template>
  2. <el-table-v2
  3. :columns="columns"
  4. :data="data"
  5. :sort-by="sortBy"
  6. :width="700"
  7. :height="400"
  8. fixed
  9. @column-sort="onSort"
  10. />
  11. </template>
  12. <script lang="ts" setup>
  13. import { ref } from 'vue'
  14. import { TableV2FixedDir, TableV2SortOrder } from 'element-plus'
  15. import type { SortBy } from 'element-plus'
  16. const generateColumns = (length = 10, prefix = 'column-', props?: any) =>
  17. Array.from({ length }).map((_, columnIndex) => ({
  18. ...props,
  19. key: `${prefix}${columnIndex}`,
  20. dataKey: `${prefix}${columnIndex}`,
  21. title: `Column ${columnIndex}`,
  22. width: 150,
  23. }))
  24. const generateData = (
  25. columns: ReturnType<typeof generateColumns>,
  26. length = 200,
  27. prefix = 'row-'
  28. ) =>
  29. Array.from({ length }).map((_, rowIndex) => {
  30. return columns.reduce(
  31. (rowData, column, columnIndex) => {
  32. rowData[column.dataKey] = `Row ${rowIndex} - Col ${columnIndex}`
  33. return rowData
  34. },
  35. {
  36. id: `${prefix}${rowIndex}`,
  37. parentId: null,
  38. }
  39. )
  40. })
  41. const columns = generateColumns(10)
  42. let data = generateData(columns, 200)
  43. columns[0].fixed = true
  44. columns[1].fixed = TableV2FixedDir.LEFT
  45. columns[9].fixed = TableV2FixedDir.RIGHT
  46. for (let i = 0; i < 3; i++) columns[i].sortable = true
  47. const sortBy = ref<SortBy>({
  48. key: 'column-0',
  49. order: TableV2SortOrder.ASC,
  50. })
  51. const onSort = (_sortBy: SortBy) => {
  52. data = data.reverse()
  53. sortBy.value = _sortBy
  54. }
  55. </script>