diff --git a/packages/dropdown/__tests__/dropdown.spec.tsx b/packages/dropdown/__tests__/dropdown.spec.tsx index 1ea508e5d8..bda1789e2e 100644 --- a/packages/dropdown/__tests__/dropdown.spec.tsx +++ b/packages/dropdown/__tests__/dropdown.spec.tsx @@ -9,6 +9,7 @@ const TIMEOUT = 250 const MOUSE_ENTER_EVENT = 'mouseenter' const MOUSE_LEAVE_EVENT = 'mouseleave' const CLICK = 'click' +const CONTEXTMENU = 'contextmenu' const _mount = (template: string, data, otherObj?) => mount({ components: { @@ -136,6 +137,37 @@ describe('Dropdown', () => { expect(content.visible).toBe(true) }) + test('trigger contextmenu', async () => { + const wrapper = _mount( + ` + + + dropdown + + + + `, + () => ({ + myCommandObject: { name: 'CommandC' }, + name: '', + }), + ) + const content = wrapper.findComponent({ ref: 'b' }).vm as any + const triggerElm = wrapper.find('.el-dropdown-link') + expect(content.visible).toBe(false) + await triggerElm.trigger(CONTEXTMENU) + await sleep(TIMEOUT) + expect(content.visible).toBe(true) + }) + test('split button', async () => { const wrapper = _mount( ` diff --git a/packages/dropdown/src/dropdown-menu.vue b/packages/dropdown/src/dropdown-menu.vue index 5b4cd51123..2ca0b6e18d 100644 --- a/packages/dropdown/src/dropdown-menu.vue +++ b/packages/dropdown/src/dropdown-menu.vue @@ -27,7 +27,7 @@ export default defineComponent({ elDropdown.show?.() } function hide() { - if (elDropdown.trigger.value === 'click') return + if (['click', 'contextmenu'].includes(elDropdown.trigger.value)) return _hide() } function _hide() { diff --git a/packages/dropdown/src/dropdown.vue b/packages/dropdown/src/dropdown.vue index 1fc96f7fc8..137d7fd23f 100644 --- a/packages/dropdown/src/dropdown.vue +++ b/packages/dropdown/src/dropdown.vue @@ -156,7 +156,7 @@ export default defineComponent({ () => { visible.value = true }, - props.trigger === 'click' ? 0 : props.showTimeout, + ['click', 'contextmenu'].includes(props.trigger) ? 0 : props.showTimeout, ) } @@ -171,7 +171,7 @@ export default defineComponent({ () => { visible.value = false }, - props.trigger === 'click' ? 0 : props.hideTimeout, + ['click', 'contextmenu'].includes(props.trigger) ? 0 : props.hideTimeout, ) } @@ -226,6 +226,11 @@ export default defineComponent({ on(triggerElm.value, 'mouseleave', hide) } else if (props.trigger === 'click') { on(triggerElm.value, 'click', handleClick) + } else if (props.trigger === 'contextmenu') { + on(triggerElm.value, 'contextmenu', e => { + e.preventDefault() + handleClick() + }) } Object.assign(_instance, { diff --git a/website/docs/en-US/dropdown.md b/website/docs/en-US/dropdown.md index 16276d52b7..74ccec8012 100644 --- a/website/docs/en-US/dropdown.md +++ b/website/docs/en-US/dropdown.md @@ -18,7 +18,7 @@ Hover on the dropdown menu to unfold it for more actions. Action 3 Action 4 Action 5 - + @@ -101,7 +101,7 @@ Click the triggering element or hover on it. ```html - + hover to trigger @@ -118,7 +118,7 @@ Click the triggering element or hover on it. - + click to trigger @@ -135,6 +135,23 @@ Click the triggering element or hover on it. + + right click to trigger + + + Dropdown List + + + +