Skip to content

Commit 2f3163c

Browse files
KaelWDblalan05
authored andcommitted
fix(VMenu): unregister on unmount
fixes #17094
1 parent a62a425 commit 2f3163c

File tree

4 files changed

+22
-8
lines changed

4 files changed

+22
-8
lines changed

packages/vuetify/src/components/VAutocomplete/VAutocomplete.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ export const VAutocomplete = genericComponent<new <
140140
const menu = computed({
141141
get: () => _menu.value,
142142
set: v => {
143-
if (_menu.value && !v && vMenuRef.value?.ΨopenChildren) return
143+
if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return
144144
_menu.value = v
145145
},
146146
})

packages/vuetify/src/components/VCombobox/VCombobox.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ export const VCombobox = genericComponent<new <
144144
const menu = computed({
145145
get: () => _menu.value,
146146
set: v => {
147-
if (_menu.value && !v && vMenuRef.value?.ΨopenChildren) return
147+
if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return
148148
_menu.value = v
149149
},
150150
})

packages/vuetify/src/components/VMenu/VMenu.tsx

+19-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,18 @@ import { useProxiedModel } from '@/composables/proxiedModel'
1313
import { useScopeId } from '@/composables/scopeId'
1414

1515
// Utilities
16-
import { computed, inject, mergeProps, nextTick, provide, ref, shallowRef, watch } from 'vue'
16+
import {
17+
computed,
18+
inject,
19+
mergeProps,
20+
nextTick,
21+
onBeforeUnmount,
22+
onDeactivated,
23+
provide,
24+
ref,
25+
shallowRef,
26+
watch,
27+
} from 'vue'
1728
import { VMenuSymbol } from './shared'
1829
import {
1930
focusableChildren,
@@ -66,17 +77,17 @@ export const VMenu = genericComponent<OverlaySlots>()({
6677
const overlay = ref<VOverlay>()
6778

6879
const parent = inject(VMenuSymbol, null)
69-
const openChildren = shallowRef(0)
80+
const openChildren = shallowRef(new Set<number>())
7081
provide(VMenuSymbol, {
7182
register () {
72-
++openChildren.value
83+
openChildren.value.add(uid)
7384
},
7485
unregister () {
75-
--openChildren.value
86+
openChildren.value.delete(uid)
7687
},
7788
closeParents (e) {
7889
setTimeout(() => {
79-
if (!openChildren.value &&
90+
if (!openChildren.value.size &&
8091
!props.persistent &&
8192
(e == null || (overlay.value?.contentEl && !isClickInsideElement(e, overlay.value.contentEl)))
8293
) {
@@ -87,6 +98,9 @@ export const VMenu = genericComponent<OverlaySlots>()({
8798
},
8899
})
89100

101+
onBeforeUnmount(() => parent?.unregister())
102+
onDeactivated(() => isActive.value = false)
103+
90104
async function onFocusIn (e: FocusEvent) {
91105
const before = e.relatedTarget as HTMLElement | null
92106
const after = e.target as HTMLElement | null

packages/vuetify/src/components/VSelect/VSelect.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ export const VSelect = genericComponent<new <
146146
const menu = computed({
147147
get: () => _menu.value,
148148
set: v => {
149-
if (_menu.value && !v && vMenuRef.value?.ΨopenChildren) return
149+
if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return
150150
_menu.value = v
151151
},
152152
})

0 commit comments

Comments
 (0)