@@ -103,6 +103,7 @@ import type {
103
103
ComponentFilter ,
104
104
ElementType ,
105
105
} from 'react-devtools-shared/src/types' ;
106
+ import is from 'shared/objectIs' ;
106
107
107
108
type getDisplayNameForFiberType = ( fiber : Fiber ) => string | null ;
108
109
type getTypeSymbolType = ( type : any ) => Symbol | number ;
@@ -1073,6 +1074,48 @@ export function attach(
1073
1074
return null ;
1074
1075
}
1075
1076
1077
+ function areHookInputsEqual (
1078
+ nextDeps : Array < mixed > ,
1079
+ prevDeps : Array < mixed > | null ,
1080
+ ) {
1081
+ if ( prevDeps === null ) {
1082
+ return false ;
1083
+ }
1084
+
1085
+ for (let i = 0; i < prevDeps . length && i < nextDeps . length ; i ++ ) {
1086
+ if ( is ( nextDeps [ i ] , prevDeps [ i ] ) ) {
1087
+ continue ;
1088
+ }
1089
+ return false ;
1090
+ }
1091
+ return true ;
1092
+ }
1093
+
1094
+ function isEffect ( memoizedState ) {
1095
+ return (
1096
+ memoizedState !== null &&
1097
+ typeof memoizedState === 'object' &&
1098
+ memoizedState . hasOwnProperty ( 'tag' ) &&
1099
+ memoizedState . hasOwnProperty ( 'create' ) &&
1100
+ memoizedState . hasOwnProperty ( 'destroy' ) &&
1101
+ memoizedState . hasOwnProperty ( 'deps' ) &&
1102
+ memoizedState . hasOwnProperty ( 'next' )
1103
+ ) ;
1104
+ }
1105
+
1106
+ function didHookChange ( prev : Hook , next : Hook ) : boolean {
1107
+ const prevMemoizedState = prev . memoizedState ;
1108
+ const nextMemoizedState = next . memoizedState ;
1109
+
1110
+ if ( isEffect ( prevMemoizedState ) && isEffect ( nextMemoizedState ) ) {
1111
+ return ! areHookInputsEqual (
1112
+ nextMemoizedState . deps ,
1113
+ prevMemoizedState . deps ,
1114
+ ) ;
1115
+ }
1116
+ return nextMemoizedState !== prevMemoizedState ;
1117
+ }
1118
+
1076
1119
function didHooksChange ( prev : any , next : any ) : boolean {
1077
1120
if ( prev == null || next == null ) {
1078
1121
return false ;
@@ -1086,7 +1129,7 @@ export function attach(
1086
1129
next . hasOwnProperty ( 'queue ')
1087
1130
) {
1088
1131
while ( next !== null ) {
1089
- if ( next . memoizedState !== prev . memoizedState ) {
1132
+ if ( didHookChange ( prev , next ) ) {
1090
1133
return true ;
1091
1134
} else {
1092
1135
next = next . next ;
0 commit comments