@@ -39,6 +39,9 @@ export interface ReactiveEffectRunner<T = any> {
3939export let activeSub : Subscriber | undefined
4040
4141export enum EffectFlags {
42+ /**
43+ * ReactiveEffect only
44+ */
4245 ACTIVE = 1 << 0 ,
4346 RUNNING = 1 << 1 ,
4447 TRACKING = 1 << 2 ,
@@ -69,7 +72,13 @@ export interface Subscriber extends DebuggerOptions {
6972 /**
7073 * @internal
7174 */
72- notify ( ) : void
75+ next ?: Subscriber
76+ /**
77+ * returning `true` indicates it's a computed that needs to call notify
78+ * on its dep too
79+ * @internal
80+ */
81+ notify ( ) : true | void
7382}
7483
7584const pausedQueueEffects = new WeakSet < ReactiveEffect > ( )
@@ -92,7 +101,7 @@ export class ReactiveEffect<T = any>
92101 /**
93102 * @internal
94103 */
95- nextEffect ?: ReactiveEffect = undefined
104+ next ?: Subscriber = undefined
96105 /**
97106 * @internal
98107 */
@@ -134,9 +143,7 @@ export class ReactiveEffect<T = any>
134143 return
135144 }
136145 if ( ! ( this . flags & EffectFlags . NOTIFIED ) ) {
137- this . flags |= EffectFlags . NOTIFIED
138- this . nextEffect = batchedEffect
139- batchedEffect = this
146+ batch ( this )
140147 }
141148 }
142149
@@ -226,7 +233,13 @@ export class ReactiveEffect<T = any>
226233// }
227234
228235let batchDepth = 0
229- let batchedEffect : ReactiveEffect | undefined
236+ let batchedSub : Subscriber | undefined
237+
238+ export function batch ( sub : Subscriber ) : void {
239+ sub . flags |= EffectFlags . NOTIFIED
240+ sub . next = batchedSub
241+ batchedSub = sub
242+ }
230243
231244/**
232245 * @internal
@@ -245,16 +258,17 @@ export function endBatch(): void {
245258 }
246259
247260 let error : unknown
248- while ( batchedEffect ) {
249- let e : ReactiveEffect | undefined = batchedEffect
250- batchedEffect = undefined
261+ while ( batchedSub ) {
262+ let e : Subscriber | undefined = batchedSub
263+ batchedSub = undefined
251264 while ( e ) {
252- const next : ReactiveEffect | undefined = e . nextEffect
253- e . nextEffect = undefined
265+ const next : Subscriber | undefined = e . next
266+ e . next = undefined
254267 e . flags &= ~ EffectFlags . NOTIFIED
255268 if ( e . flags & EffectFlags . ACTIVE ) {
256269 try {
257- e . trigger ( )
270+ // ACTIVE flag is effect-only
271+ ; ( e as ReactiveEffect ) . trigger ( )
258272 } catch ( err ) {
259273 if ( ! error ) error = err
260274 }
0 commit comments