diff --git a/packages/components/_private/overlay/src/Overlay.tsx b/packages/components/_private/overlay/src/Overlay.tsx index ced358869..20c912568 100644 --- a/packages/components/_private/overlay/src/Overlay.tsx +++ b/packages/components/_private/overlay/src/Overlay.tsx @@ -6,7 +6,7 @@ */ import type { OverlayProps } from './types' -import type { PopperElement, PopperEvents } from '@idux/cdk/popper' +import type { PopperElement, PopperEvents, PopperOptions } from '@idux/cdk/popper' import { type ComputedRef, @@ -18,6 +18,7 @@ import { defineComponent, onBeforeUnmount, onMounted, + ref, toRef, vShow, watch, @@ -40,7 +41,9 @@ export default defineComponent({ setup(props, { slots, attrs, expose }) { const common = useGlobalConfig('common') const mergedPrefixCls = computed(() => `${common.prefixCls}-overlay`) - const popperOptions = usePopperOptions(props) + const contentArrowRef = ref() + const popperOptions = usePopperOptions(props, contentArrowRef) + const { arrowRef, popperRef, @@ -68,6 +71,13 @@ export default defineComponent({ () => props.visible, visible => (visible ? show() : hide()), ) + watch( + contentArrowRef, + () => { + arrowRef.value = contentArrowRef.value + }, + { immediate: true }, + ) const onAfterLeave = () => { if (props.destroyOnHide) { @@ -114,7 +124,7 @@ export default defineComponent({ visibility, currentZIndex, contentNode!, - arrowRef, + contentArrowRef, popperRef, popperEvents, attrs, @@ -134,10 +144,19 @@ export default defineComponent({ }, }) -function usePopperOptions(props: OverlayProps) { +function usePopperOptions(props: OverlayProps, arrowRef: Ref): ComputedRef { return computed(() => { const { allowEnter, autoAdjust, delay, disabled, offset, placement, trigger } = props - return { allowEnter, autoAdjust, delay, disabled, offset, placement, trigger } + let _offset: [number, number] | undefined + if (!arrowRef.value) { + _offset = offset + } else { + const { offsetWidth, offsetHeight } = arrowRef.value + _offset = offset ? [...offset] : [0, 0] + _offset[1] += [offsetWidth, offsetHeight][1] / 2 + } + + return { allowEnter, autoAdjust, delay, disabled, offset: _offset, placement, trigger } }) }