cross-hovering.vue 2.2 KB

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