|
1 | 1 | import Portal from '@rc-component/portal'; |
2 | 2 | import { clsx } from 'clsx'; |
3 | 3 | import type { CSSMotionProps } from '@rc-component/motion'; |
4 | | -import ResizeObserver from '@rc-component/resize-observer'; |
5 | | -import { isDOM } from '@rc-component/util/lib/Dom/findDOMNode'; |
| 4 | +import { useResizeObserver } from '@rc-component/resize-observer'; |
| 5 | +import { getDOM, isDOM } from '@rc-component/util/lib/Dom/findDOMNode'; |
6 | 6 | import { getShadowRoot } from '@rc-component/util/lib/Dom/shadow'; |
| 7 | +import { getNodeRef, useComposeRef } from '@rc-component/util/lib/ref'; |
7 | 8 | import useEvent from '@rc-component/util/lib/hooks/useEvent'; |
8 | 9 | import useId from '@rc-component/util/lib/hooks/useId'; |
9 | 10 | import useLayoutEffect from '@rc-component/util/lib/hooks/useLayoutEffect'; |
@@ -261,9 +262,11 @@ export function generateTrigger( |
261 | 262 | const externalForwardRef = React.useRef<HTMLElement>(null); |
262 | 263 |
|
263 | 264 | const setTargetRef = useEvent((node: HTMLElement) => { |
264 | | - if (isDOM(node) && targetEle !== node) { |
265 | | - setTargetEle(node); |
266 | | - externalForwardRef.current = node; |
| 265 | + const domNode = getDOM(node) as HTMLElement; |
| 266 | + |
| 267 | + if (isDOM(domNode) && targetEle !== domNode) { |
| 268 | + setTargetEle(domNode); |
| 269 | + externalForwardRef.current = domNode; |
267 | 270 | } |
268 | 271 | }); |
269 | 272 |
|
@@ -782,22 +785,25 @@ export function generateTrigger( |
782 | 785 | y: arrowY, |
783 | 786 | }; |
784 | 787 |
|
| 788 | + // =================== Resize Observer =================== |
| 789 | + // Use hook to observe target element resize |
| 790 | + // Pass targetEle directly instead of a function so the hook will re-observe when target changes |
| 791 | + useResizeObserver(mergedOpen, targetEle, onTargetResize); |
| 792 | + |
| 793 | + // Compose refs |
| 794 | + const mergedRef = useComposeRef(setTargetRef, getNodeRef(child)); |
| 795 | + |
785 | 796 | // Child Node |
786 | 797 | const triggerNode = React.cloneElement(child, { |
787 | 798 | ...mergedChildrenProps, |
788 | 799 | ...passedProps, |
| 800 | + ref: mergedRef, |
789 | 801 | }); |
790 | 802 |
|
791 | 803 | // Render |
792 | 804 | return ( |
793 | 805 | <> |
794 | | - <ResizeObserver |
795 | | - disabled={!mergedOpen} |
796 | | - ref={setTargetRef} |
797 | | - onResize={onTargetResize} |
798 | | - > |
799 | | - {triggerNode} |
800 | | - </ResizeObserver> |
| 806 | + {triggerNode} |
801 | 807 | {rendedRef.current && (!uniqueContext || !unique) && ( |
802 | 808 | <TriggerContext.Provider value={context}> |
803 | 809 | <Popup |
|
0 commit comments