fix(components): [table] show-overflow-tooltip dynamic switch (#21811)

* fix(components): el-table-column: show-overflow-tooltip dynamic switch

* fix(components): el-table-column: show-overflow-tooltip dynamic switch

* test: add test case

* chore: remove previous tests

---------

Co-authored-by: Dsaquel <291874700n@gmail.com>
This commit is contained in:
dhj-l
2025-08-21 07:11:58 +08:00
committed by GitHub
parent ada03b0798
commit 96e3278472
3 changed files with 60 additions and 1 deletions

View File

@@ -2337,6 +2337,56 @@ describe('Table.vue', () => {
mockCellRect2.mockRestore()
})
it('should cleanup tooltip dynamically', async () => {
const mockRangeRect = vi
.spyOn(Range.prototype, 'getBoundingClientRect')
.mockReturnValue({
width: 150,
height: 30,
} as DOMRect)
const wrapper = mount({
components: {
ElTable,
ElTableColumn,
},
template: `
<el-table :data="testData">
<el-table-column :show-overflow-tooltip="showOverflowTooltip" class-name="overflow_tooltip" prop="name" label="name"/>
</el-table>
`,
data() {
return {
testData: getTestData(),
showOverflowTooltip: true,
}
},
})
await doubleWait()
const tr = wrapper.findAll('.overflow_tooltip')
const mockCellRect = vi
.spyOn(tr[1].find('.cell').element, 'getBoundingClientRect')
.mockReturnValue({
width: 100,
height: 30,
} as DOMRect)
await tr[1].trigger('mouseenter')
await rAF()
expect(wrapper.find('.el-popper').exists()).toBe(true)
await wrapper.setData({ showOverflowTooltip: false })
await tr[1].trigger('mouseleave')
await rAF()
await tr[1].trigger('mouseenter')
await rAF()
expect(wrapper.find('.el-popper').exists()).toBe(false)
mockRangeRect.mockRestore()
mockCellRect.mockRestore()
wrapper.unmount()
})
it('use-tooltip-formatter', async () => {
const testData = getTestData() as any
const mockRangeRect = vi

View File

@@ -125,6 +125,9 @@ function useEvents<T extends DefaultRow>(props: Partial<TableBodyProps<T>>) {
}
if (!tooltipOptions) {
if (removePopper?.trigger === cell) {
removePopper?.()
}
return
}

View File

@@ -507,8 +507,14 @@ export function createTablePopper<T extends DefaultRow>(
vm.component!.exposed!.onOpen()
const scrollContainer = parentNode?.querySelector(`.${ns}-scrollbar__wrap`)
removePopper = () => {
if (vm.component?.exposed?.onClose) {
vm.component.exposed.onClose()
}
render(null, container)
scrollContainer?.removeEventListener('scroll', removePopper!)
const currentRemovePopper = removePopper as RemovePopperFn
scrollContainer?.removeEventListener('scroll', currentRemovePopper)
currentRemovePopper.trigger = undefined
currentRemovePopper.vm = undefined
removePopper = null
}
removePopper.trigger = trigger ?? undefined