diff --git a/docs/en-US/component/dropdown.md b/docs/en-US/component/dropdown.md index 9a39eb5e46..70ae905cf8 100644 --- a/docs/en-US/component/dropdown.md +++ b/docs/en-US/component/dropdown.md @@ -95,6 +95,16 @@ dropdown/command-event ::: +## Dropdown methods + +You can open or close the dropdown menu by manually use `handleOpen` or `handleClose` + +:::demo + +dropdown/dropdown-methods + +::: + ## Sizes Besides default size, Dropdown component provides three additional sizes for you to choose among different scenarios. @@ -138,6 +148,13 @@ dropdown/sizes | command | triggers when a dropdown item is clicked | the command dispatched from the dropdown item | | visible-change | triggers when the dropdown appears/disappears | true when it appears, and false otherwise | +## Dropdown Methods + +| Method | Description | Parameters | +| ----------- | ----------------------- | ---------- | +| handleOpen | open the dropdown menu | — | +| handleClose | close the dropdown menu | — | + ## Dropdown-Menu Slots | Name | Description | Subtags | diff --git a/docs/examples/dropdown/dropdown-methods.vue b/docs/examples/dropdown/dropdown-methods.vue new file mode 100644 index 0000000000..a284364484 --- /dev/null +++ b/docs/examples/dropdown/dropdown-methods.vue @@ -0,0 +1,48 @@ + + + diff --git a/packages/components/dropdown/__tests__/dropdown.spec.ts b/packages/components/dropdown/__tests__/dropdown.spec.ts index b94f17ee76..4d56ff2ee5 100644 --- a/packages/components/dropdown/__tests__/dropdown.spec.ts +++ b/packages/components/dropdown/__tests__/dropdown.spec.ts @@ -187,6 +187,44 @@ describe('Dropdown', () => { expect(content.open).toBe(true) }) + test('handleOpen and handleClose', async () => { + const wrapper = _mount( + ` + + + dropdown + + + + `, + () => ({ + name: '', + }) + ) + await nextTick() + const dropdown = wrapper.vm + const content = wrapper.findComponent(ElTooltip).vm as InstanceType< + typeof ElTooltip + > + expect(content.open).toBe(false) + await dropdown.$refs.refDropdown.handleOpen() + jest.runAllTimers() + await rAF() + expect(content.open).toBe(true) + await dropdown.$refs.refDropdown.handleClose() + jest.runAllTimers() + await rAF() + expect(content.open).toBe(false) + }) + test('split button', async () => { const handleClick = jest.fn() const wrapper = _mount( diff --git a/packages/components/dropdown/src/dropdown.ts b/packages/components/dropdown/src/dropdown.ts index fd151e660e..db2bfc7153 100644 --- a/packages/components/dropdown/src/dropdown.ts +++ b/packages/components/dropdown/src/dropdown.ts @@ -9,18 +9,12 @@ import type { Options } from '@popperjs/core' import type { ButtonType } from '@element-plus/components/button' import type { Placement } from '@element-plus/components/popper' -import type { - ComponentInternalInstance, - Component, - ComputedRef, - Ref, -} from 'vue' +import type { ComponentInternalInstance, Component, ComputedRef } from 'vue' import type { Nullable } from '@element-plus/utils/types' export interface IElDropdownInstance { instance?: ComponentInternalInstance dropdownSize?: ComputedRef - visible?: Ref handleClick?: () => void commandHandler?: (...arg) => void show?: () => void diff --git a/packages/components/dropdown/src/dropdown.vue b/packages/components/dropdown/src/dropdown.vue index 124dd11c05..c521840af9 100644 --- a/packages/components/dropdown/src/dropdown.vue +++ b/packages/components/dropdown/src/dropdown.vue @@ -121,7 +121,6 @@ export default defineComponent({ const referenceElementRef = ref() const popperRef = ref | null>(null) const contentRef = ref(null) - const visible = ref(false) const scrollbar = ref(null) const currentTabId = ref(null) const isUsingKeyboard = ref(false) @@ -134,9 +133,17 @@ export default defineComponent({ ]) function handleClick() { + handleClose() + } + + function handleClose() { popperRef.value?.onClose() } + function handleOpen() { + popperRef.value?.onOpen() + } + const dropdownSize = useSize() function commandHandler(...args: any[]) { @@ -175,7 +182,6 @@ export default defineComponent({ provide('elDropdown', { instance: _instance, dropdownSize, - visible, handleClick, commandHandler, trigger: toRef(props, 'trigger'), @@ -194,7 +200,6 @@ export default defineComponent({ } return { - visible, scrollbar, wrapStyle, dropdownTriggerKls, @@ -203,6 +208,8 @@ export default defineComponent({ handleCurrentTabIdChange, handlerMainButtonClick, handleEntryFocus, + handleClose, + handleOpen, onMountOnFocus, popperRef, triggeringElementRef,