Skip to content

Commit c911200

Browse files
author
hanchao
committed
fix(cascader): fix position calculation on reopening menu, closes #7321
1 parent cff4bc6 commit c911200

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

src/cascader/src/Cascader.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -896,7 +896,17 @@ export default defineComponent({
896896
selectMenuFollowerRef.value?.syncPosition()
897897
}
898898
function syncCascaderMenuPosition(): void {
899-
cascaderMenuFollowerRef.value?.syncPosition()
899+
const followerInst = cascaderMenuFollowerRef.value
900+
if (followerInst) {
901+
// Reset transform before syncPosition to ensure getBoundingClientRect
902+
// returns correct values for position calculation.
903+
const followerEl = (followerInst as any)
904+
.followerRef as HTMLElement | null
905+
if (followerEl) {
906+
followerEl.style.transform = ''
907+
}
908+
followerInst.syncPosition()
909+
}
900910
}
901911
function handleTriggerResize(): void {
902912
if (mergedShowRef.value) {

src/cascader/src/CascaderMenu.tsx

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@ import {
1212
defineComponent,
1313
h,
1414
inject,
15+
onBeforeUnmount,
1516
ref,
1617
Transition,
18+
watch,
1719
withDirectives
1820
} from 'vue'
21+
import { resizeObserverManager } from 'vueuc'
1922
import { NBaseMenuMask } from '../../_internal'
2023
import FocusDetector from '../../_internal/focus-detector'
21-
import { resolveSlot, resolveWrappedSlot, useOnResize } from '../../_utils'
24+
import { resolveSlot, resolveWrappedSlot } from '../../_utils'
2225
import { NEmpty } from '../../empty'
2326
import NCascaderSubmenu from './CascaderSubmenu'
2427
import { cascaderInjectionKey } from './interface'
@@ -74,7 +77,22 @@ export default defineComponent({
7477
function handleResize(): void {
7578
syncCascaderMenuPosition()
7679
}
77-
useOnResize(selfElRef, handleResize)
80+
// Watch selfElRef to re-register resize handler when DOM is recreated
81+
// This is needed because the menu DOM is destroyed when show=false
82+
watch(selfElRef, (el, oldEl) => {
83+
if (oldEl) {
84+
resizeObserverManager.unregisterHandler(oldEl)
85+
}
86+
if (el) {
87+
resizeObserverManager.registerHandler(el, handleResize)
88+
}
89+
})
90+
onBeforeUnmount(() => {
91+
const { value: el } = selfElRef
92+
if (el) {
93+
resizeObserverManager.unregisterHandler(el)
94+
}
95+
})
7896
function showErrorMessage(label: string): void {
7997
const {
8098
value: { loadingRequiredMessage }

0 commit comments

Comments
 (0)