@@ -7,7 +7,7 @@ import DomWrapper from './DomWrapper';
77import { CollectionContext } from '../Collection' ;
88
99export interface SingleObserverProps extends ResizeObserverProps {
10- children : React . ReactElement ;
10+ children : React . ReactElement | ( ( ref : React . RefObject < Element > ) => React . ReactElement ) ;
1111}
1212
1313export default function SingleObserver ( props : SingleObserverProps ) {
@@ -17,6 +17,10 @@ export default function SingleObserver(props: SingleObserverProps) {
1717
1818 const onCollectionResize = React . useContext ( CollectionContext ) ;
1919
20+ // =========================== Children ===========================
21+ const isRenderProps = typeof children === 'function' ;
22+ const mergedChildren = isRenderProps ? children ( elementRef ) : children ;
23+
2024 // ============================= Size =============================
2125 const sizeRef = React . useRef ( {
2226 width : - 1 ,
@@ -26,8 +30,9 @@ export default function SingleObserver(props: SingleObserverProps) {
2630 } ) ;
2731
2832 // ============================= Ref ==============================
29- const canRef = React . isValidElement ( children ) && supportRef ( children ) ;
30- const originRef : React . Ref < Element > = canRef ? ( children as any ) . ref : null ;
33+ const canRef =
34+ ! isRenderProps && React . isValidElement ( mergedChildren ) && supportRef ( mergedChildren ) ;
35+ const originRef : React . Ref < Element > = canRef ? ( mergedChildren as any ) . ref : null ;
3136
3237 const mergedRef = React . useMemo (
3338 ( ) => composeRef < Element > ( originRef , elementRef ) ,
@@ -100,10 +105,10 @@ export default function SingleObserver(props: SingleObserverProps) {
100105 return (
101106 < DomWrapper ref = { wrapperRef } >
102107 { canRef
103- ? React . cloneElement ( children as any , {
108+ ? React . cloneElement ( mergedChildren as any , {
104109 ref : mergedRef ,
105110 } )
106- : children }
111+ : mergedChildren }
107112 </ DomWrapper >
108113 ) ;
109114}
0 commit comments