From 21db2f3bdc2574b152e56d1c1919a39ad54a7d94 Mon Sep 17 00:00:00 2001 From: devin Date: Tue, 7 Mar 2023 21:25:59 +0800 Subject: [PATCH 1/7] token theme attr --- packages/opendesign/src/components/style/dark.token.css | 8 ++++---- .../src/components/style/default-light.token.css | 8 ++++---- packages/scripts/src/gen-tokens/index.ts | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/opendesign/src/components/style/dark.token.css b/packages/opendesign/src/components/style/dark.token.css index 816bc980d..64377f1d5 100644 --- a/packages/opendesign/src/components/style/dark.token.css +++ b/packages/opendesign/src/components/style/dark.token.css @@ -1,5 +1,5 @@ /* theme: dark */ -:root[theme="dark"] { +[data-o-theme="dark"] { /** * @name * @type palette @@ -1196,21 +1196,21 @@ * @group radius * @description 大尺寸控件圆角 */ - --o-radius-control-l: var(--o-radius-control-l); + --o-radius-control-l: var(--o-radius-l); /** * @name 中尺寸控件圆角 * @type size * @group radius * @description 中尺寸控件圆角 */ - --o-radius-control-m: var(--o-radius-control-m); + --o-radius-control-m: var(--o-radius-m); /** * @name 小尺寸控件圆角 * @type size * @group radius * @description 小尺寸控件圆角 */ - --o-radius-control-s: var(--o-radius-control-s); + --o-radius-control-s: var(--o-radius-s); /** * @name 持续时间 * @type animation diff --git a/packages/opendesign/src/components/style/default-light.token.css b/packages/opendesign/src/components/style/default-light.token.css index 6ce10582f..ab0d97593 100644 --- a/packages/opendesign/src/components/style/default-light.token.css +++ b/packages/opendesign/src/components/style/default-light.token.css @@ -1,6 +1,6 @@ /* theme: default|light */ :root, -:root[theme="light"] { +[data-o-theme="light"] { /** * @name * @type palette @@ -1197,21 +1197,21 @@ * @group radius * @description 大尺寸控件圆角 */ - --o-radius-control-l: var(--o-radius-control-l); + --o-radius-control-l: var(--o-radius-l); /** * @name 中尺寸控件圆角 * @type size * @group radius * @description 中尺寸控件圆角 */ - --o-radius-control-m: var(--o-radius-control-m); + --o-radius-control-m: var(--o-radius-m); /** * @name 小尺寸控件圆角 * @type size * @group radius * @description 小尺寸控件圆角 */ - --o-radius-control-s: var(--o-radius-control-s); + --o-radius-control-s: var(--o-radius-s); /** * @name 持续时间 * @type animation diff --git a/packages/scripts/src/gen-tokens/index.ts b/packages/scripts/src/gen-tokens/index.ts index 3e734e465..416431bd6 100644 --- a/packages/scripts/src/gen-tokens/index.ts +++ b/packages/scripts/src/gen-tokens/index.ts @@ -141,7 +141,7 @@ function tokenCssTemplate(themeArray: string[], tokens: Array) { if (t === 'default') { return ':root'; } - return `:root[theme="${t}"]`; + return `[data-o-theme="${t}"]`; }); return `/* theme: ${themeArray.join('|')} */ -- Gitee From 9845dd6d331736aa703c623c0c2332d712708f30 Mon Sep 17 00:00:00 2001 From: devin Date: Wed, 8 Mar 2023 14:25:32 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E6=9E=84=E5=BB=BA=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/opendesign/package.json | 2 +- packages/scripts/src/build-components/vite.config.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/opendesign/package.json b/packages/opendesign/package.json index b1357eb00..055018ddf 100644 --- a/packages/opendesign/package.json +++ b/packages/opendesign/package.json @@ -2,7 +2,7 @@ "name": "@opensig/opendesign", "version": "0.0.2", "main": "lib/index.js", - "module": "es/index.js", + "module": "es/index.mjs", "types": "es/index.d.ts", "typings": "lib/index.d.ts", "unpkg": "dist/opendesign.min.js", diff --git a/packages/scripts/src/build-components/vite.config.ts b/packages/scripts/src/build-components/vite.config.ts index 289496d2e..687bd1443 100644 --- a/packages/scripts/src/build-components/vite.config.ts +++ b/packages/scripts/src/build-components/vite.config.ts @@ -22,16 +22,16 @@ export default (): InlineConfig => { { format: 'es', dir: 'es', - entryFileNames: '[name].js', + entryFileNames: '[name].mjs', preserveModules: true, - preserveModulesRoot: 'components', + preserveModulesRoot: 'src/components', }, { format: 'commonjs', dir: 'lib', entryFileNames: '[name].js', preserveModules: true, - preserveModulesRoot: 'components', + preserveModulesRoot: 'src/components', }, ], external: ['vue'], -- Gitee From e797ae5cae3e6184dd96301459588025323410bc Mon Sep 17 00:00:00 2001 From: devin Date: Wed, 8 Mar 2023 14:26:55 +0800 Subject: [PATCH 3/7] rm --- packages/opendesign/README.md | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/packages/opendesign/README.md b/packages/opendesign/README.md index e47e7b781..b6adf0304 100644 --- a/packages/opendesign/README.md +++ b/packages/opendesign/README.md @@ -1,21 +1,3 @@ # opendesign components -- vue3 components - -# build - -1. generate icon component - ``` - pnpm gen:icon - ``` -2. build component - - ``` - pnpm build:component - ``` - -3. build style - - ``` - pnpm build:style - ``` +- vue3 components for opendesign -- Gitee From c03bb50d7cedac14d1a11bf332f5c2e003199858 Mon Sep 17 00:00:00 2001 From: devin Date: Wed, 8 Mar 2023 14:28:28 +0800 Subject: [PATCH 4/7] up vresion --- packages/opendesign/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opendesign/package.json b/packages/opendesign/package.json index 055018ddf..c62854b60 100644 --- a/packages/opendesign/package.json +++ b/packages/opendesign/package.json @@ -1,6 +1,6 @@ { "name": "@opensig/opendesign", - "version": "0.0.2", + "version": "0.0.3", "main": "lib/index.js", "module": "es/index.mjs", "types": "es/index.d.ts", -- Gitee From b009016d1f0c2d3c44fd307faeb573fb0e2e5ede Mon Sep 17 00:00:00 2001 From: devin Date: Wed, 8 Mar 2023 18:12:50 +0800 Subject: [PATCH 5/7] =?UTF-8?q?ssr=20=E5=85=BC=E5=AE=B9=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/docs/global.md | 6 + .../src/components/_shared/client-only.ts | 17 ++ .../src/components/directves/click-outside.ts | 7 +- .../components/directves/on-intersection.ts | 9 +- .../src/components/directves/on-resize.ts | 9 +- .../hooks/use-element-intersection.ts | 9 +- .../components/hooks/use-element-resize.ts | 9 +- .../hooks/use-intersection-observer.ts | 2 +- .../src/components/hooks/use-out-click.ts | 24 +- .../components/hooks/use-resize-observer.ts | 2 +- packages/opendesign/src/components/index.scss | 1 + packages/opendesign/src/components/index.ts | 1 + .../src/components/input/OInput.vue | 14 +- .../components/input/__demo__/InputBasic.vue | 2 +- .../src/components/popup/OPopup.vue | 212 +++++++++--------- .../opendesign/src/components/popup/popup.ts | 2 +- .../opendesign/src/components/popup/types.ts | 2 +- .../src/components/select/OSelect.vue | 53 ++--- .../src/components/tabs/OTabPane.vue | 39 ++-- .../src/components/textarea/OTextarea.vue | 10 +- .../opendesign/src/components/vite-env.d.ts | 6 +- 21 files changed, 246 insertions(+), 190 deletions(-) create mode 100644 packages/opendesign/src/components/_shared/client-only.ts diff --git a/packages/docs/global.md b/packages/docs/global.md index e3dd5322c..a5cb12b33 100644 --- a/packages/docs/global.md +++ b/packages/docs/global.md @@ -35,3 +35,9 @@ - 边框(bd) `--btn-bd: 1px solid var(--o-color-control1)` - 边框颜色(bd-color) `--btn-bd-color: var(--o-color-control1)` - 背景颜色(bg-color) `--btn-bg-color: var(--o-color-control1)` + +# polyfill + +> resize-observer-polyfill +> intersection-observer-polyfill +> 建议在项目使用时引入 diff --git a/packages/opendesign/src/components/_shared/client-only.ts b/packages/opendesign/src/components/_shared/client-only.ts new file mode 100644 index 000000000..04dc3d01c --- /dev/null +++ b/packages/opendesign/src/components/_shared/client-only.ts @@ -0,0 +1,17 @@ +import { defineComponent, onMounted, ref } from 'vue'; + +/** + * 只渲染一个子元素 + */ +export default defineComponent({ + name: 'ClientOnly', + setup(props, { slots }) { + const isMoutned = ref(false); + onMounted(() => { + isMoutned.value = true; + }); + return () => { + return isMoutned.value ? slots.default?.() : null; + }; + }, +}); diff --git a/packages/opendesign/src/components/directves/click-outside.ts b/packages/opendesign/src/components/directves/click-outside.ts index d379d1761..2530a3cd3 100644 --- a/packages/opendesign/src/components/directves/click-outside.ts +++ b/packages/opendesign/src/components/directves/click-outside.ts @@ -1,14 +1,15 @@ import { ObjectDirective, DirectiveBinding } from 'vue'; import { useOutClick } from '../hooks/use-out-click'; -const { addOutClickListener, removeOutClickListener } = useOutClick(); +let out: ReturnType | null = null; const vOutClick: ObjectDirective = { beforeMount(el: HTMLElement, binding: DirectiveBinding) { - addOutClickListener(el, binding.value); + out = useOutClick(); + out?.addOutClickListener(el, binding.value); }, unmounted(el: HTMLElement) { - removeOutClickListener(el); + out?.removeOutClickListener(el); } }; diff --git a/packages/opendesign/src/components/directves/on-intersection.ts b/packages/opendesign/src/components/directves/on-intersection.ts index 73468b4ae..158c2cf84 100644 --- a/packages/opendesign/src/components/directves/on-intersection.ts +++ b/packages/opendesign/src/components/directves/on-intersection.ts @@ -2,19 +2,22 @@ import { DirectiveBinding, ObjectDirective } from 'vue'; import { useIntersectionObserver, IntersectionListenerT } from '../hooks'; import { isFunction } from '../_shared/is'; -const io = useIntersectionObserver(); +let io: ReturnType | null = null; let listener: IntersectionListenerT = () => null; const vIntersection: ObjectDirective = { + beforeMount() { + io = useIntersectionObserver(); + }, mounted(el: HTMLElement, binding: DirectiveBinding) { if (isFunction(binding.value)) { listener = binding.value; - io.addIntersectionListener(el, listener); + io?.addIntersectionListener(el, listener); } }, unmounted(el: HTMLElement) { if (listener) { - io.removeIntersectionListener(el, listener); + io?.removeIntersectionListener(el, listener); } }, }; diff --git a/packages/opendesign/src/components/directves/on-resize.ts b/packages/opendesign/src/components/directves/on-resize.ts index 6348ad476..7d7f9619a 100644 --- a/packages/opendesign/src/components/directves/on-resize.ts +++ b/packages/opendesign/src/components/directves/on-resize.ts @@ -2,19 +2,22 @@ import { DirectiveBinding, ObjectDirective } from 'vue'; import { useResizeObserver, ResizeListenerT } from '../hooks'; import { isFunction } from '../_shared/is'; -const ob = useResizeObserver(); let listener: ResizeListenerT = () => null; +let ro: ReturnType | null = null; const vOnResize: ObjectDirective = { + beforeMount() { + ro = useResizeObserver(); + }, mounted(el: HTMLElement, binding: DirectiveBinding) { if (isFunction(binding.value)) { listener = binding.value; - ob.addResizeListener(el, listener); + ro?.addResizeListener(el, listener); } }, unmounted(el: HTMLElement) { if (listener) { - ob.removeResizeListener(el, listener); + ro?.removeResizeListener(el, listener); } }, }; diff --git a/packages/opendesign/src/components/hooks/use-element-intersection.ts b/packages/opendesign/src/components/hooks/use-element-intersection.ts index 37943dba5..30c20e713 100644 --- a/packages/opendesign/src/components/hooks/use-element-intersection.ts +++ b/packages/opendesign/src/components/hooks/use-element-intersection.ts @@ -3,21 +3,24 @@ import { useIntersectionObserver } from './use-intersection-observer'; import type { IntersectionListenerT } from './use-intersection-observer'; import { isFunction } from '../_shared/is'; -const io = useIntersectionObserver(); +let io: ReturnType | null = null; export function useIntersectionObserverDirective({ listener, removeOnUnmounted }: { listener: IntersectionListenerT, removeOnUnmounted?: boolean }): { vIntersectionObserver: ObjectDirective } { return { vIntersectionObserver: { + beforeMount() { + io = useIntersectionObserver(); + }, mounted(el: HTMLElement) { if (isFunction(listener)) { - io.addIntersectionListener(el, listener); + io?.addIntersectionListener(el, listener); } }, unmounted(el: HTMLElement) { if (listener && removeOnUnmounted) { - io.removeIntersectionListener(el, listener); + io?.removeIntersectionListener(el, listener); } }, } diff --git a/packages/opendesign/src/components/hooks/use-element-resize.ts b/packages/opendesign/src/components/hooks/use-element-resize.ts index 72c60f481..bfc633ed2 100644 --- a/packages/opendesign/src/components/hooks/use-element-resize.ts +++ b/packages/opendesign/src/components/hooks/use-element-resize.ts @@ -3,18 +3,21 @@ import { useResizeObserver } from './use-resize-observer'; import type { ResizeListenerT } from './use-resize-observer'; import { isFunction } from '../_shared/is'; -const ob = useResizeObserver(); +let ro: ReturnType | null = null; export function useReiszeObserverDirective(onResize: ResizeListenerT): { vResizeObserver: ObjectDirective } { return { vResizeObserver: { + beforeMount() { + ro = useResizeObserver(); + }, mounted(el: HTMLElement) { if (isFunction(onResize)) { - ob.addResizeListener(el, onResize); + ro?.addResizeListener(el, onResize); } }, unmounted(el: HTMLElement) { if (onResize) { - ob.removeResizeListener(el, onResize); + ro?.removeResizeListener(el, onResize); } }, } diff --git a/packages/opendesign/src/components/hooks/use-intersection-observer.ts b/packages/opendesign/src/components/hooks/use-intersection-observer.ts index 2a62f8c8d..8d2022319 100644 --- a/packages/opendesign/src/components/hooks/use-intersection-observer.ts +++ b/packages/opendesign/src/components/hooks/use-intersection-observer.ts @@ -1,4 +1,4 @@ -import IntersectionObserver from 'intersection-observer-polyfill'; +// import IntersectionObserver from 'intersection-observer-polyfill'; import { isFunction } from '../_shared/is'; export type IntersectionListenerT = (entry: IntersectionObserverEntry) => void; diff --git a/packages/opendesign/src/components/hooks/use-out-click.ts b/packages/opendesign/src/components/hooks/use-out-click.ts index 90f5d9912..b2a8126ef 100644 --- a/packages/opendesign/src/components/hooks/use-out-click.ts +++ b/packages/opendesign/src/components/hooks/use-out-click.ts @@ -5,18 +5,6 @@ interface handlerItemT { const elList = new Map>(); -window.addEventListener('mousedown', (e) => { - elList.forEach((handlers, el) => { - if (!el.contains(e.target as HTMLElement)) { - handlers.forEach(item => { - if (!item.exception || !item.exception(e)) { - item.handler(); - } - }); - } - }); -}); - function addOutClickListener(el: HTMLElement, fn: () => void, exception?: (e: MouseEvent) => boolean) { if (!elList.has(el)) { elList.set(el, []); @@ -47,6 +35,18 @@ function removeOutClickListener(el: HTMLElement, listener?: () => void) { } export function useOutClick() { + window.addEventListener('mousedown', (e) => { + elList.forEach((handlers, el) => { + if (!el.contains(e.target as HTMLElement)) { + handlers.forEach(item => { + if (!item.exception || !item.exception(e)) { + item.handler(); + } + }); + } + }); + }); + return { addOutClickListener, removeOutClickListener, diff --git a/packages/opendesign/src/components/hooks/use-resize-observer.ts b/packages/opendesign/src/components/hooks/use-resize-observer.ts index ebacf7065..70a5ec1b6 100644 --- a/packages/opendesign/src/components/hooks/use-resize-observer.ts +++ b/packages/opendesign/src/components/hooks/use-resize-observer.ts @@ -1,4 +1,4 @@ -import ResizeObserver from 'resize-observer-polyfill'; +// import ResizeObserver from 'resize-observer-polyfill'; import { isFunction } from '../_shared/is'; export type ResizeListenerT = (entry: ResizeObserverEntry, isFirst: boolean) => void; diff --git a/packages/opendesign/src/components/index.scss b/packages/opendesign/src/components/index.scss index 186605131..c7ffbf783 100644 --- a/packages/opendesign/src/components/index.scss +++ b/packages/opendesign/src/components/index.scss @@ -8,6 +8,7 @@ @use './input/style//index.scss' as *; @use './input-number/style//index.scss' as *; @use './textarea/style//index.scss' as *; +@use './option/style//index.scss' as *; @use './select/style//index.scss' as *; @use './tabs/style//index.scss' as *; @use './table/style//index.scss' as *; diff --git a/packages/opendesign/src/components/index.ts b/packages/opendesign/src/components/index.ts index 8ca317c60..c3df0fb14 100644 --- a/packages/opendesign/src/components/index.ts +++ b/packages/opendesign/src/components/index.ts @@ -10,6 +10,7 @@ export * from './popover'; export * from './input'; export * from './input-number'; export * from './textarea'; +export * from './option'; export * from './select'; export * from './tabs'; export * from './table'; diff --git a/packages/opendesign/src/components/input/OInput.vue b/packages/opendesign/src/components/input/OInput.vue index c48b75d4b..7bc488124 100644 --- a/packages/opendesign/src/components/input/OInput.vue +++ b/packages/opendesign/src/components/input/OInput.vue @@ -9,6 +9,7 @@ import { toInputString } from './input'; import { OResizeObserver } from '../resize-observer'; import { inputProps } from './types'; import { getRoundClass } from '../_shared/style-class'; +import ClientOnly from '../_shared/client-only'; const props = defineProps(inputProps); @@ -41,7 +42,6 @@ watch( // 输入框显示的字符串 const displayValue = computed(() => { const v = isFunction(props.format) ? props.format(realValue.value) : realValue.value; - // console.log('displayValue', v, realValue.value); return v; }); @@ -53,6 +53,7 @@ const isClearable = computed(() => props.clearable && !props.disabled && !props. function updateValue(val: string) { const value = isFunction(props.parse) ? props.parse(val) : val; emits('update:modelValue', value); + realValue.value = value; if (lastValue !== value) { emits('change', value); @@ -140,7 +141,8 @@ const onMouseDown = (e: MouseEvent) => { }; const onMirrorResize = (en: ResizeObserverEntry) => { - inputWidth.value = en.target.clientWidth; + // + 1; 修复宽度为小数的情况 + inputWidth.value = en.target.clientWidth + 1; }; const round = getRoundClass(props, 'input'); @@ -200,9 +202,11 @@ const round = getRoundClass(props, 'input'); @compositionstart="onCompositionStart" @compositionend="onCompositionEnd" /> - -
{{ inputText }}
-
+ + +
{{ inputText }}
+
+
diff --git a/packages/opendesign/src/components/input/__demo__/InputBasic.vue b/packages/opendesign/src/components/input/__demo__/InputBasic.vue index 0bab96192..d1d9aaf79 100644 --- a/packages/opendesign/src/components/input/__demo__/InputBasic.vue +++ b/packages/opendesign/src/components/input/__demo__/InputBasic.vue @@ -19,7 +19,7 @@ setTimeout(() => {

text:

- +

password:

diff --git a/packages/opendesign/src/components/popup/OPopup.vue b/packages/opendesign/src/components/popup/OPopup.vue index a4c0719ac..8a1a4640b 100644 --- a/packages/opendesign/src/components/popup/OPopup.vue +++ b/packages/opendesign/src/components/popup/OPopup.vue @@ -15,6 +15,7 @@ import { OResizeObserver } from '../resize-observer'; import { useIntersectionObserver } from '../hooks'; import type { IntersectionListenerT } from '../hooks'; import { OChildOnly } from '../child-only'; +import ClientOnly from '../_shared/client-only'; // TODO 处理嵌套 @@ -52,8 +53,77 @@ const anchorStyle = reactive<{ left?: string; top?: string; right?: string; bott const toMount = ref(false); const isAnimating = ref(false); -const { addResizeListener, removeResizeListener } = useResizeObserver(); -const intersctionObserver = useIntersectionObserver(); +let ro: ReturnType | null = null; +let io: ReturnType | null = null; + +onMounted(() => { + ro = useResizeObserver(); + io = useIntersectionObserver(); + + // 在mounted事件后再显示,避免找不到wrapper + visible.value = props.visible; + + // 触发元素为dom或者选择器,处理事件触发 + nextTick(() => { + if (!wrapperEl.value) { + if (typeof props.wrapper === 'string') { + wrapperEl.value = document.querySelector(props.wrapper); + } else { + wrapperEl.value = props.wrapper; + } + } + + // 绑定触发元素事件 + if (typeof props.target === 'string') { + bindTargetEvent(document.querySelector(props.target)); + } else if (isElement(props.target)) { + bindTargetEvent(props.target as HTMLElement); + } + + // 初始为true时,更新样式 + // if (visible.value) { + // updatePopupStyle(); + // } + }); +}); + +let triggerListener: ReturnType = []; +const bindTargetEvent = (el: HTMLElement | null) => { + if (!el) { + return; + } + targetEl = el; + + // 初始化popup宽度,避免引起resize,触发重复计算 + if (props.adjustMinWidth) { + popStyle.minWidth = `${targetEl.offsetWidth}px`; + } else if (props.adjustWidth) { + popStyle.width = `${targetEl.offsetWidth}px`; + } + + triggerListener = bindTrigger(el, popupRef, triggers, { + updateFn: updateVisible, + hoverDelay: props.hoverDelay, + }); + + if (props.hideWhenTargetInvisible) { + io?.addIntersectionListener(targetEl, onTargetInterscting); + } +}; + +onUnmounted(() => { + // 移除触发事件 + triggerListener.forEach((fn) => { + fn(); + }); + // 销毁popup 的 resize监听 + if (wrapperEl.value) { + ro?.removeResizeListener(wrapperEl.value, onResize); + } + if (targetEl) { + ro?.removeResizeListener(targetEl, onResize); + } +}); // 处理popup位置 const updatePopupStyle = () => { @@ -149,7 +219,7 @@ const updateVisible = (isVisible?: boolean, delay?: number) => { toMount.value = true; if (props.hideWhenTargetInvisible && targetEl) { - intersctionObserver.addIntersectionListener(targetEl, onTargetInterscting); + io?.addIntersectionListener(targetEl, onTargetInterscting); } } }; @@ -162,30 +232,6 @@ const updateVisible = (isVisible?: boolean, delay?: number) => { } }; -let triggerListener: ReturnType = []; -const bindTargetEvent = (el: HTMLElement | null) => { - if (!el) { - return; - } - targetEl = el; - - // 初始化popup宽度,避免引起resize,触发重复计算 - if (props.adjustMinWidth) { - popStyle.minWidth = `${targetEl.offsetWidth}px`; - } else if (props.adjustWidth) { - popStyle.width = `${targetEl.offsetWidth}px`; - } - - triggerListener = bindTrigger(el, popupRef, triggers, { - updateFn: updateVisible, - hoverDelay: props.hoverDelay, - }); - - if (props.hideWhenTargetInvisible) { - intersctionObserver.addIntersectionListener(targetEl, onTargetInterscting); - } -}; - // 触发元素为组件ref,因生命周期问题,延后绑定处理事件触发 watch( () => props.target, @@ -251,7 +297,7 @@ watch(popupRef, (popEl) => { }); // 监听targetEL尺寸变化 - addResizeListener(targetEl, (en: ResizeObserverEntry, isFirst: boolean) => { + ro?.addResizeListener(targetEl, (en: ResizeObserverEntry, isFirst: boolean) => { if (props.adjustMinWidth) { popStyle.minWidth = `${targetEl?.offsetWidth}px`; } else if (props.adjustWidth) { @@ -263,7 +309,7 @@ watch(popupRef, (popEl) => { if (wrapperEl.value) { // 监听warpper尺寸变化 - addResizeListener(wrapperEl.value, onResize); + ro?.addResizeListener(wrapperEl.value, onResize); } } else { /** @@ -272,11 +318,11 @@ watch(popupRef, (popEl) => { handles.forEach((hl) => hl()); if (wrapperEl.value) { - removeResizeListener(wrapperEl.value, onResize); + ro?.removeResizeListener(wrapperEl.value, onResize); } if (targetEl) { - removeResizeListener(targetEl, onResize); - intersctionObserver.removeIntersectionListener(targetEl, onTargetInterscting); + ro?.removeResizeListener(targetEl, onResize); + io?.removeIntersectionListener(targetEl, onTargetInterscting); isTargetInViewport.value = true; } } @@ -291,82 +337,42 @@ const onPopupHoverOut = () => { updateVisible(false, props.hoverDelay); } }; - -onMounted(() => { - // 在mounted事件后再显示,避免找不到wrapper - visible.value = props.visible; - - // 触发元素为dom或者选择器,处理事件触发 - nextTick(() => { - if (!wrapperEl.value) { - if (typeof props.wrapper === 'string') { - wrapperEl.value = document.querySelector(props.wrapper); - } else { - wrapperEl.value = props.wrapper; - } - } - - // 绑定触发元素事件 - if (typeof props.target === 'string') { - bindTargetEvent(document.querySelector(props.target)); - } else if (isElement(props.target)) { - bindTargetEvent(props.target as HTMLElement); - } - - // 初始为true时,更新样式 - // if (visible.value) { - // updatePopupStyle(); - // } - }); -}); - -onUnmounted(() => { - // 移除触发事件 - triggerListener.forEach((fn) => { - fn(); - }); - // 销毁popup 的 resize监听 - if (wrapperEl.value) { - removeResizeListener(wrapperEl.value, onResize); - } - if (targetEl) { - removeResizeListener(targetEl, onResize); - } -}); diff --git a/packages/opendesign/src/components/popup/popup.ts b/packages/opendesign/src/components/popup/popup.ts index 1d5540057..4f0190bc0 100644 --- a/packages/opendesign/src/components/popup/popup.ts +++ b/packages/opendesign/src/components/popup/popup.ts @@ -5,7 +5,6 @@ import type { PopupPositionT, PopupTriggerT } from './types'; import { useOutClick } from '../hooks/use-out-click'; -const { addOutClickListener, removeOutClickListener } = useOutClick(); interface Pos { left: number, top: number @@ -404,6 +403,7 @@ export function bindTrigger( if (!el) { return []; } + const { addOutClickListener, removeOutClickListener } = useOutClick(); const listeners: Array<() => void> = []; diff --git a/packages/opendesign/src/components/popup/types.ts b/packages/opendesign/src/components/popup/types.ts index 423e2e3ae..7b3552a64 100644 --- a/packages/opendesign/src/components/popup/types.ts +++ b/packages/opendesign/src/components/popup/types.ts @@ -39,7 +39,7 @@ export const popupProps = { */ wrapper: { type: [String, Object] as PropType, - default: document.body, + default: 'body', }, /** * 距离target偏移量 diff --git a/packages/opendesign/src/components/select/OSelect.vue b/packages/opendesign/src/components/select/OSelect.vue index a16c910fe..114a5de92 100644 --- a/packages/opendesign/src/components/select/OSelect.vue +++ b/packages/opendesign/src/components/select/OSelect.vue @@ -6,6 +6,7 @@ import { OPopup } from '../popup'; import { selectOptionInjectKey } from './provide'; import { SelectOptionT, selectProps } from './types'; import { getRoundClass } from '../_shared/style-class'; +import ClientOnly from '../_shared/client-only'; const props = defineProps(selectProps); const emits = defineEmits<{ @@ -69,34 +70,36 @@ provide(selectOptionInjectKey, { :style="round.style.value" > - - +
+
- +
- +
- -
- - -
-
-
- -
-
+
+
+ + +
+ +
+
+ +
+
+
diff --git a/packages/opendesign/src/components/tabs/OTabPane.vue b/packages/opendesign/src/components/tabs/OTabPane.vue index f59f419b2..60abf5db7 100644 --- a/packages/opendesign/src/components/tabs/OTabPane.vue +++ b/packages/opendesign/src/components/tabs/OTabPane.vue @@ -8,6 +8,7 @@ import { computed, getCurrentInstance, inject, onMounted, nextTick, ref, watch } import { tabsInjectKey } from './provide'; import { tabPaneProps } from './types'; import { IconClose } from '../_shared/icons'; +import ClientOnly from '../_shared/client-only'; const props = defineProps(tabPaneProps); @@ -73,25 +74,27 @@ onMounted(() => { });