From a832dd5a99b74343c1e5dd470b4084db32242cf5 Mon Sep 17 00:00:00 2001 From: CatsAndMice Date: Sun, 26 Dec 2021 14:26:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(popover):=20=E5=A2=9E=E5=8A=A0controlled?= =?UTF-8?q?=E5=B1=9E=E6=80=A7(https://github.com/DevCloudFE/vue-devui/issu?= =?UTF-8?q?es/97)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devui/popover/__tests__/popover.spec.ts | 8 +- .../devui-vue/devui/popover/src/popover.tsx | 19 ++- .../docs/components/popover/index.md | 125 ++++++++++++------ .../docs/en-US/components/popover/index.md | 91 +++++++++---- 4 files changed, 164 insertions(+), 79 deletions(-) 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