1
1
import { QSubscribers } from '../shared/utils/markers' ;
2
- import type { ElementVNode , VNode , VirtualVNode } from '../client/types' ;
3
- import {
4
- ensureMaterialized ,
5
- vnode_getProp ,
6
- vnode_isElementVNode ,
7
- vnode_setProp ,
8
- } from '../client/vnode' ;
2
+ import type { VNode } from '../client/types' ;
3
+ import { ensureMaterialized , vnode_getProp , vnode_isElementVNode } from '../client/vnode' ;
9
4
import { EffectSubscriptionsProp , WrappedSignal , isSignal , type Signal } from './signal' ;
10
5
import type { Container } from '../shared/types' ;
11
6
import { StoreHandler , getStoreHandler , isStore , type TargetType } from './store' ;
@@ -24,48 +19,28 @@ export function clearVNodeEffectDependencies(container: Container, value: VNode)
24
19
if ( vnode_isElementVNode ( value ) ) {
25
20
ensureMaterialized ( value ) ;
26
21
}
27
- const effects = vnode_getProp < Subscriber [ ] > ( value , QSubscribers , container . $getObjectById$ ) ;
22
+ const effects = vnode_getProp < Set < Subscriber > > ( value , QSubscribers , container . $getObjectById$ ) ;
23
+
28
24
if ( ! effects ) {
29
25
return ;
30
26
}
31
- for ( let i = effects . length - 1 ; i >= 0 ; i -- ) {
32
- const subscriber = effects [ i ] ;
33
- clearEffects ( subscriber , value , effects , i , container ) ;
34
- }
35
-
36
- if ( effects . length === 0 ) {
37
- vnode_setProp ( value as ElementVNode | VirtualVNode , QSubscribers , null ) ;
27
+ for ( const subscriber of effects ) {
28
+ clearEffects ( subscriber , value , effects , container ) ;
38
29
}
39
30
}
40
31
41
32
export function clearSubscriberEffectDependencies ( container : Container , value : Subscriber ) : void {
42
33
if ( value . $effectDependencies$ ) {
43
34
for ( const subscriber of value . $effectDependencies$ ) {
44
- let subscriptionRemoved = false ;
45
- const seenSet = new Set ( ) ;
46
- if ( subscriber instanceof WrappedSignal ) {
47
- subscriptionRemoved = clearSignalEffects ( subscriber , value , seenSet ) ;
48
- } else if ( container . $storeProxyMap$ . has ( subscriber ) ) {
49
- const store = container . $storeProxyMap$ . get ( subscriber ) ! ;
50
- const handler = getStoreHandler ( store ) ! ;
51
- subscriptionRemoved = clearStoreEffects ( handler , value ) ;
52
- }
53
- if ( subscriptionRemoved ) {
54
- value . $effectDependencies$ . delete ( subscriber ) ;
55
- }
56
- }
57
-
58
- if ( value . $effectDependencies$ . size === 0 ) {
59
- value . $effectDependencies$ . clear ( ) ;
35
+ clearEffects ( subscriber , value , value . $effectDependencies$ , container ) ;
60
36
}
61
37
}
62
38
}
63
39
64
40
function clearEffects (
65
41
subscriber : Subscriber | TargetType ,
66
42
value : Subscriber | VNode ,
67
- effectArray : ( Subscriber | TargetType ) [ ] ,
68
- indexToRemove : number ,
43
+ effectArray : Set < Subscriber | TargetType > ,
69
44
container : Container
70
45
) {
71
46
let subscriptionRemoved = false ;
@@ -78,7 +53,7 @@ function clearEffects(
78
53
subscriptionRemoved = clearStoreEffects ( handler , value ) ;
79
54
}
80
55
if ( subscriptionRemoved ) {
81
- effectArray . splice ( indexToRemove , 1 ) ;
56
+ effectArray . delete ( subscriber ) ;
82
57
}
83
58
}
84
59
0 commit comments