cross-hovering.vue 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <template>
  2. <div style="height: 400px">
  3. <el-auto-resizer>
  4. <template #default="{ height, width }">
  5. <el-table-v2 :columns="columns" :cell-props="cellProps" :class="kls" :data="data" :width="width" :height="height" />
  6. </template>
  7. </el-auto-resizer>
  8. </div>
  9. </template>
  10. <script lang="ts" setup>
  11. import { ref } from 'vue'
  12. const generateColumns = (length = 10, prefix = 'column-', props?: any) =>
  13. Array.from({ length }).map((_, columnIndex) => ({
  14. ...props,
  15. key: `${prefix}${columnIndex}`,
  16. dataKey: `${prefix}${columnIndex}`,
  17. title: `Column ${columnIndex}`,
  18. width: 150,
  19. }))
  20. const generateData = (columns: ReturnType<typeof generateColumns>, length = 200, prefix = 'row-') =>
  21. Array.from({ length }).map((_, rowIndex) => {
  22. return columns.reduce(
  23. (rowData, column, columnIndex) => {
  24. rowData[column.dataKey] = `Row ${rowIndex} - Col ${columnIndex}`
  25. return rowData
  26. },
  27. {
  28. id: `${prefix}${rowIndex}`,
  29. parentId: null,
  30. }
  31. )
  32. })
  33. const columns = generateColumns(10)
  34. columns.unshift({
  35. key: 'column-n-1',
  36. width: 50,
  37. title: 'Row No.',
  38. cellRenderer: ({ rowIndex }) => `${rowIndex + 1}`,
  39. align: 'center',
  40. })
  41. const data = generateData(columns, 200)
  42. const cellProps = ({ columnIndex }) => {
  43. const key = `hovering-col-${columnIndex}`
  44. return {
  45. ['data-key']: key,
  46. onMouseenter: () => {
  47. kls.value = key
  48. },
  49. onMouseleave: () => {
  50. kls.value = ''
  51. },
  52. }
  53. }
  54. const kls = ref<string>('')
  55. </script>
  56. <style>
  57. .hovering-col-0 [data-key='hovering-col-0'],
  58. .hovering-col-1 [data-key='hovering-col-1'],
  59. .hovering-col-2 [data-key='hovering-col-2'],
  60. .hovering-col-3 [data-key='hovering-col-3'],
  61. .hovering-col-4 [data-key='hovering-col-4'],
  62. .hovering-col-5 [data-key='hovering-col-5'],
  63. .hovering-col-6 [data-key='hovering-col-6'],
  64. .hovering-col-7 [data-key='hovering-col-7'],
  65. .hovering-col-8 [data-key='hovering-col-8'],
  66. .hovering-col-9 [data-key='hovering-col-9'],
  67. .hovering-col-10 [data-key='hovering-col-10'] {
  68. background: var(--el-table-row-hover-bg-color);
  69. }
  70. [data-key='hovering-col-0'] {
  71. font-weight: bold;
  72. user-select: none;
  73. pointer-events: none;
  74. }
  75. </style>