@@ -33,6 +33,8 @@ let fiberRoot = null;
33
33
let doWork = true ;
34
34
const circularComponentTable = new Set ( ) ;
35
35
let isRecoil = false ;
36
+ let allAtomsRelationship = [ ] ;
37
+ let initialstart = false ;
36
38
37
39
// Simple check for whether our target app uses Recoil
38
40
if ( window [ `$recoilDebugStates` ] ) {
@@ -154,7 +156,6 @@ function traverseHooks(memoizedState: any): HookStates {
154
156
return hooksStates ;
155
157
}
156
158
157
- let allAtomsRelationship = [ ] ;
158
159
/**
159
160
* @method createTree
160
161
* @param currentFiber A Fiber object
@@ -167,8 +168,8 @@ let allAtomsRelationship = [];
167
168
* 3. Build a new state snapshot
168
169
*/
169
170
// This runs after every Fiber commit. It creates a new snapshot
170
-
171
- let recoilObj = { } ;
171
+ let atomsSelectors = { } ;
172
+ let atomsComponents = { } ;
172
173
173
174
function createTree (
174
175
currentFiber : Fiber ,
@@ -196,49 +197,50 @@ function createTree(
196
197
treeBaseDuration,
197
198
} = currentFiber ;
198
199
199
- //Checks Recoil Atom and Selector Relationships
200
+ //Checks Recoil Atom and Selector Relationships
200
201
if (
201
202
currentFiber . memoizedState &&
202
203
currentFiber . memoizedState . next &&
203
204
currentFiber . memoizedState . next . memoizedState &&
204
205
currentFiber . memoizedState . next . memoizedState . deps &&
205
206
isRecoil &&
206
- currentFiber . tag !== 15
207
+ currentFiber . tag === 0 &&
208
+ currentFiber . key === null //prevents capturing the same Fiber nodes but different key values that result from being changed
207
209
) {
208
-
209
210
let pointer = currentFiber . memoizedState . next ;
210
- let componentName = currentFiber . elementType . name
211
-
212
- if ( ! recoilObj [ componentName ] ) {
213
- recoilObj [ componentName ] = [ ] ;
214
- while ( pointer !== null ) {
215
- if ( ! Array . isArray ( pointer . memoizedState ) ) {
216
- let atomName = pointer . memoizedState . deps [ 0 ] [ 'key' ] ;
217
- recoilObj [ componentName ] . push (
218
- atomName ,
219
- ) ;
211
+ let componentName = currentFiber . elementType . name ;
212
+
213
+ if ( ! atomsComponents [ componentName ] ) {
214
+ atomsComponents [ componentName ] = [ ] ;
215
+ while ( pointer !== null ) {
216
+ if ( ! Array . isArray ( pointer . memoizedState ) ) {
217
+ let atomName = pointer . memoizedState . deps [ 0 ] [ 'key' ] ;
218
+ atomsComponents [ componentName ] . push ( atomName ) ;
220
219
}
221
- pointer = pointer . next ;
220
+ pointer = pointer . next ;
222
221
}
223
222
}
224
223
225
- if ( currentFiber . memoizedState . next . memoizedState . deps [ 1 ] . current ) {
224
+ if (
225
+ currentFiber . memoizedState . next . memoizedState . deps [ 1 ] . current &&
226
+ ! initialstart
227
+ ) {
226
228
let getState = currentFiber . memoizedState . next . memoizedState . deps [ 1 ] . current . getState ( )
227
229
. graphsByVersion ;
228
-
229
230
getState . entries ( ) . forEach ( ( value ) => {
230
231
value [ 1 ] . nodeDeps . entries ( ) . forEach ( ( obj ) => {
231
- if ( ! recoilObj [ obj [ 0 ] ] ) {
232
- recoilObj [ obj [ 0 ] ] = [ ] ;
232
+ if ( ! atomsSelectors [ obj [ 0 ] ] ) {
233
+ atomsSelectors [ obj [ 0 ] ] = [ ] ;
233
234
}
234
235
obj [ 1 ] . values ( ) . forEach ( ( selector ) => {
235
- if ( ! recoilObj [ obj [ 0 ] ] . includes ( selector ) ) {
236
- recoilObj [ obj [ 0 ] ] . push ( selector ) ;
236
+ if ( ! atomsSelectors [ obj [ 0 ] ] . includes ( selector ) ) {
237
+ atomsSelectors [ obj [ 0 ] ] . push ( selector ) ;
237
238
}
238
239
} ) ;
239
240
} ) ;
240
241
} ) ;
241
- }
242
+ initialstart = true ;
243
+ }
242
244
}
243
245
244
246
let newState : any | { hooksState ?: any [ ] } = { } ;
0 commit comments