@@ -13,10 +13,12 @@ import { isSamePoint, restoreFocus, monitorResize } from './util';
1313import { AlignType , AlignResult , TargetType , TargetPoint } from './interface' ;
1414import useBuffer from './hooks/useBuffer' ;
1515
16+ type OnAlign = ( source : HTMLElement , result : AlignResult ) => void ;
17+
1618export interface AlignProps {
1719 align : AlignType ;
1820 target : TargetType ;
19- onAlign ?: ( source : HTMLElement , result : AlignResult ) => void ;
21+ onAlign ?: OnAlign ;
2022 monitorBufferTime ?: number ;
2123 monitorWindowResize ?: boolean ;
2224 disabled ?: boolean ;
@@ -51,19 +53,24 @@ const Align: React.RefForwardingComponent<RefAlign, AlignProps> = (
5153 let childNode = React . Children . only ( children ) ;
5254
5355 // ===================== Align ======================
54- const forceAlignRef = React . useRef < Function > ( ) ;
56+ // We save the props here to avoid closure makes props ood
57+ const forceAlignPropsRef = React . useRef < {
58+ disabled ?: boolean ;
59+ target ?: TargetType ;
60+ onAlign ?: OnAlign ;
61+ } > ( { } ) ;
62+ forceAlignPropsRef . current . disabled = disabled ;
63+ forceAlignPropsRef . current . target = target ;
64+ forceAlignPropsRef . current . onAlign = onAlign ;
5565
5666 const [ forceAlign , cancelForceAlign ] = useBuffer ( ( ) => {
57- forceAlignRef . current ( ) ;
58- } , monitorBufferTime ) ;
59-
60- forceAlignRef . current = ( ) => {
61- if ( ! disabled && target ) {
67+ const { disabled : latestDisabled , target : latestTarget } = forceAlignPropsRef . current ;
68+ if ( ! latestDisabled && latestTarget ) {
6269 const source = findDOMNode < HTMLElement > ( nodeRef . current ) ;
6370
6471 let result : AlignResult ;
65- const element = getElement ( target ) ;
66- const point = getPoint ( target ) ;
72+ const element = getElement ( latestTarget ) ;
73+ const point = getPoint ( latestTarget ) ;
6774
6875 cacheRef . current . element = element ;
6976 cacheRef . current . point = point ;
@@ -83,10 +90,12 @@ const Align: React.RefForwardingComponent<RefAlign, AlignProps> = (
8390 if ( onAlign ) {
8491 onAlign ( source , result ) ;
8592 }
86- } else {
87- cancelForceAlign ( ) ;
93+
94+ return true ;
8895 }
89- } ;
96+
97+ return false ;
98+ } , monitorBufferTime ) ;
9099
91100 // ===================== Effect =====================
92101 // Listen for target updated
0 commit comments