@@ -10,41 +10,48 @@ export default function useHeights<T>(
10
10
getKey : GetKey < T > ,
11
11
onItemAdd ?: ( item : T ) => void ,
12
12
onItemRemove ?: ( item : T ) => void ,
13
- ) : [ ( item : T ) => ( instance : HTMLElement ) => void , ( ) => void , CacheMap , number ] {
13
+ ) : [ ( item : T , instance : HTMLElement ) => void , ( ) => void , CacheMap , number ] {
14
14
const [ updatedMark , setUpdatedMark ] = React . useState ( 0 ) ;
15
15
const instanceRef = useRef ( new Map < React . Key , HTMLElement > ( ) ) ;
16
16
const heightsRef = useRef ( new CacheMap ( ) ) ;
17
17
18
- const instanceFuncRef = useRef < Map < React . Key , RefFunc > > ( new Map ( ) ) ;
19
- function getInstanceRefFunc ( item : T ) {
18
+ function setInstanceRef ( item : T , instance : HTMLElement ) {
20
19
const key = getKey ( item ) ;
21
- if ( ! instanceFuncRef . current . has ( key ) ) {
22
- instanceFuncRef . current . set ( key , ( instance : HTMLElement ) => {
23
- const origin = instanceRef . current . get ( key ) ;
24
- instanceRef . current . set ( key , instance ) ;
25
-
26
- // Instance changed
27
- if ( ! origin !== ! instance ) {
28
- if ( instance ) {
29
- onItemAdd ?.( item ) ;
30
- } else {
31
- onItemRemove ?.( item ) ;
32
- }
33
- }
34
- } ) ;
20
+ const origin = instanceRef . current . get ( key ) ;
21
+
22
+ if ( instance ) {
23
+ instanceRef . current . set ( key , instance ) ;
24
+ } else {
25
+ instanceRef . current . delete ( key ) ;
26
+ }
27
+
28
+ // Instance changed
29
+ if ( ! origin !== ! instance ) {
30
+ if ( instance ) {
31
+ onItemAdd ?.( item ) ;
32
+ } else {
33
+ onItemRemove ?.( item ) ;
34
+ }
35
35
}
36
- return instanceFuncRef . current . get ( key ) ;
37
36
}
38
37
39
38
function collectHeight ( ) {
39
+ let changed = false ;
40
+
40
41
instanceRef . current . forEach ( ( element , key ) => {
41
42
if ( element && element . offsetParent ) {
42
43
const htmlElement = findDOMNode < HTMLElement > ( element ) ;
43
- heightsRef . current . set ( key , htmlElement . offsetHeight ) ;
44
+ const { offsetHeight } = htmlElement ;
45
+ if ( heightsRef . current . get ( key ) !== offsetHeight ) {
46
+ changed = true ;
47
+ heightsRef . current . set ( key , htmlElement . offsetHeight ) ;
48
+ }
44
49
}
45
50
} ) ;
46
- setUpdatedMark ( c => c + 1 ) ;
51
+ if ( changed ) {
52
+ setUpdatedMark ( c => c + 1 ) ;
53
+ }
47
54
}
48
55
49
- return [ getInstanceRefFunc , collectHeight , heightsRef . current , updatedMark ] ;
56
+ return [ setInstanceRef , collectHeight , heightsRef . current , updatedMark ] ;
50
57
}
0 commit comments