diff --git a/packages/devui-vue/devui/popover/__tests__/popover.spec.ts b/packages/devui-vue/devui/popover/__tests__/popover.spec.ts index 699d892214..387c5b3545 100644 --- a/packages/devui-vue/devui/popover/__tests__/popover.spec.ts +++ b/packages/devui-vue/devui/popover/__tests__/popover.spec.ts @@ -1,4 +1,4 @@ -import {shallowMount } from '@vue/test-utils'; +import { shallowMount } from '@vue/test-utils'; import DPopover from '../src/popover' describe('DPopover', () => { it('visible', () => { @@ -34,7 +34,11 @@ describe('DPopover', () => { }) it('trigger click', async () => { - const wrapper = shallowMount(DPopover) + const wrapper = shallowMount(DPopover, { + props: { + controlled: true + } + }) const isVisible = () => expect(wrapper.classes().includes('devui-popover-isVisible')) isVisible().toBeFalsy() await wrapper.find('.devui-popover-reference').trigger('click') diff --git a/packages/devui-vue/devui/popover/src/popover.tsx b/packages/devui-vue/devui/popover/src/popover.tsx index 017fe7da89..4298261c9c 100644 --- a/packages/devui-vue/devui/popover/src/popover.tsx +++ b/packages/devui-vue/devui/popover/src/popover.tsx @@ -47,6 +47,11 @@ export default defineComponent({ default: 1060 }, + controlled: { + type: Boolean, + default: false + }, + popType: { type: String as () => popType, default: 'default' @@ -84,7 +89,7 @@ export default defineComponent({ const { position, content, zIndex, trigger, popType, popoverStyle, mouseEnterDelay, mouseLeaveDelay, - showAnimation, popMaxWidth + showAnimation, popMaxWidth, controlled } = toRefs(props); const style: CSSProperties = { zIndex: zIndex.value, ...popoverStyle.value } const isClick = trigger.value === 'click' @@ -96,15 +101,19 @@ export default defineComponent({ } visible.value = true } - const onClick = isClick ? event : null; + const onClick = isClick && controlled.value ? event : null; const enter = debounce(() => { visible.value = true }, mouseEnterDelay.value) const leave = debounce(() => { visible.value = false }, mouseLeaveDelay.value) - const onMouseenter = isClick ? null : enter - const onMouseleave = isClick ? null : leave - const hiddenContext = () => { visible.value = false } + const onMouseenter = !isClick && controlled.value ? enter : null + const onMouseleave = !isClick && controlled.value ? leave : null + const hiddenContext = () => { + if (!controlled.value) return; + visible.value = false + } popMaxWidth.value && (style.maxWidth = `${popMaxWidth.value}px`) watch(() => props.visible, (newVal) => { + if (controlled.value) return; visible.value = newVal; }) diff --git a/packages/devui-vue/docs/components/popover/index.md b/packages/devui-vue/docs/components/popover/index.md index 5a70c3e6c6..c5652dcaab 100644 --- a/packages/devui-vue/docs/components/popover/index.md +++ b/packages/devui-vue/docs/components/popover/index.md @@ -10,34 +10,34 @@ ```vue