@@ -15,6 +15,7 @@ import {
15
15
import {
16
16
cleanUpFC ,
17
17
clearCurrentFC ,
18
+ runAllEffects ,
18
19
setCurrentFC ,
19
20
} from "./functionalComponents" ;
20
21
@@ -50,10 +51,20 @@ let elements: Fiber[] = [];
50
51
let rootContainer : HTMLElement | null = null ;
51
52
let rootFragment : DocumentFragment | null = null ;
52
53
let startTime = - 1 ;
54
+ let effectQueue : Fiber [ ] = [ ] ;
55
+
56
+ function processEffectQueue ( ) {
57
+ for ( let i = 0 ; i < effectQueue . length ; i ++ ) {
58
+ const fiber = effectQueue [ i ] ;
59
+ runAllEffects ( fiber ) ;
60
+ }
61
+ effectQueue . length = 0 ;
62
+ }
53
63
54
64
function workLoop ( deadline : IdleDeadline ) {
55
65
if ( startTime === - 1 ) startTime = performance . now ( ) ;
56
66
67
+ processEffectQueue ( ) ;
57
68
let shouldYield = false ;
58
69
while ( elements . length > 0 && ! shouldYield ) {
59
70
const element = elements . pop ( ) ;
@@ -62,6 +73,7 @@ function workLoop(deadline: IdleDeadline) {
62
73
}
63
74
64
75
if ( elements . length == 0 ) {
76
+ processEffectQueue ( ) ;
65
77
commitRootFragment ( ) ;
66
78
return ;
67
79
}
@@ -94,7 +106,7 @@ function renderNode(fiber: Fiber) {
94
106
95
107
const children = fiber . type ( fiber . props ) ;
96
108
clearCurrentFC ( ) ;
97
- // fiber.type = "FRAGMENT";
109
+
98
110
if ( Array . isArray ( children ) ) {
99
111
// which means that the FC returned a fragment
100
112
// console.log(children);
@@ -108,6 +120,8 @@ function renderNode(fiber: Fiber) {
108
120
fiber . props . children . push ( children ) ;
109
121
elements . push ( children ) ;
110
122
}
123
+ // queue to run its effects
124
+ effectQueue . push ( fiber ) ;
111
125
} else {
112
126
if ( ! fiber . dom ) fiber . dom = createNode ( fiber ) ;
113
127
let fiberParent : Fiber | undefined = fiber . parent ;
@@ -195,6 +209,10 @@ function commitFiber(
195
209
fiber . props . children . push ( children ) ;
196
210
commitFiber ( children , referenceNode , replace , true , customParent ) ;
197
211
}
212
+ // queue to run its effects at the end of current stack
213
+ queueMicrotask ( ( ) => {
214
+ runAllEffects ( fiber ) ;
215
+ } ) ;
198
216
} else {
199
217
if ( ! fiber . dom ) fiber . dom = createNode ( fiber ) ;
200
218
0 commit comments