Skip to content

Commit fb1c4cf

Browse files
author
Cuong Le
committed
fix(components): allow user to hide menu when clicking outside
when user sets `menu-trigger` to `click` and then clicking outside, it should be close menu closed #14738
1 parent 991496d commit fb1c4cf

2 files changed

Lines changed: 12 additions & 2 deletions

File tree

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"cSpell.words": ["Element Plus", "element-plus"],
33
"typescript.tsdk": "node_modules/typescript/lib",
4-
"editor.formatOnSave": true,
4+
"editor.formatOnSave": false,
55
"npm.packageManager": "pnpm",
66
"eslint.probe": [
77
"javascript",

packages/components/menu/src/sub-menu.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
watch,
1515
withDirectives,
1616
} from 'vue'
17-
import { useTimeoutFn } from '@vueuse/core'
17+
import { onClickOutside, useTimeoutFn } from '@vueuse/core'
1818
import ElCollapseTransition from '@element-plus/components/collapse-transition'
1919
import ElTooltip from '@element-plus/components/tooltip'
2020
import {
@@ -235,6 +235,7 @@ export default defineComponent({
235235
(!rootMenu.props.collapse && rootMenu.props.mode === 'vertical') ||
236236
props.disabled
237237
) {
238+
subMenu.mouseInChild.value = true
238239
return
239240
}
240241
subMenu.mouseInChild.value = true
@@ -255,6 +256,7 @@ export default defineComponent({
255256
rootMenu.props.mode === 'horizontal') ||
256257
(!rootMenu.props.collapse && rootMenu.props.mode === 'vertical')
257258
) {
259+
subMenu.mouseInChild.value = false
258260
return
259261
}
260262
timeout?.()
@@ -311,6 +313,14 @@ export default defineComponent({
311313
rootMenu.removeSubMenu(item)
312314
})
313315

316+
onClickOutside(
317+
computed(() => vPopper.value),
318+
() => {
319+
if (!mouseInChild.value && !subMenu.mouseInChild.value)
320+
rootMenu.closeMenu(props.index, indexPath.value)
321+
}
322+
)
323+
314324
return () => {
315325
const titleTag: VNodeArrayChildren = [
316326
slots.title?.(),

0 commit comments

Comments
 (0)