File tree Expand file tree Collapse file tree 3 files changed +35
-4
lines changed Expand file tree Collapse file tree 3 files changed +35
-4
lines changed Original file line number Diff line number Diff line change @@ -64,3 +64,30 @@ test('tracker recollect dependencies', () => {
64
64
expect ( fn ) . toBeCalledTimes ( 2 )
65
65
tracker . dispose ( )
66
66
} )
67
+
68
+ test ( 'shared scheduler with multi tracker(mock react strict mode)' , ( ) => {
69
+ const obs = observable < any > ( { } )
70
+
71
+ const component = ( ) => obs . value
72
+
73
+ const render = ( ) => {
74
+ tracker1 . track ( component )
75
+ tracker2 . track ( component )
76
+ }
77
+
78
+ const scheduler1 = jest . fn ( ( ) => {
79
+ tracker2 . track ( component )
80
+ } )
81
+ const scheduler2 = jest . fn ( ( ) => {
82
+ tracker1 . track ( component )
83
+ } )
84
+ const tracker1 = new Tracker ( scheduler1 , 'tracker1' )
85
+ const tracker2 = new Tracker ( scheduler2 , 'tracker2' )
86
+
87
+ render ( )
88
+
89
+ obs . value = 123
90
+
91
+ expect ( scheduler1 ) . toBeCalledTimes ( 1 )
92
+ expect ( scheduler2 ) . toBeCalledTimes ( 1 )
93
+ } )
Original file line number Diff line number Diff line change @@ -33,21 +33,21 @@ export const computed: IComputed = createAnnotation(
33
33
34
34
function getGetter ( target : any ) {
35
35
if ( ! target ) {
36
- if ( value ? .get ) return value ? .get
36
+ if ( value && value . get ) return value . get
37
37
return value
38
38
}
39
39
const descriptor = Object . getOwnPropertyDescriptor ( target , property )
40
- if ( descriptor ? .get ) return descriptor . get
40
+ if ( descriptor && descriptor . get ) return descriptor . get
41
41
return getGetter ( Object . getPrototypeOf ( target ) )
42
42
}
43
43
44
44
function getSetter ( target : any ) {
45
45
if ( ! target ) {
46
- if ( value ? .set ) return value ? .set
46
+ if ( value && value . set ) return value . set
47
47
return
48
48
}
49
49
const descriptor = Object . getOwnPropertyDescriptor ( target , property )
50
- if ( descriptor ? .set ) return descriptor . set
50
+ if ( descriptor && descriptor . set ) return descriptor . set
51
51
return getSetter ( Object . getPrototypeOf ( target ) )
52
52
}
53
53
Original file line number Diff line number Diff line change @@ -8,6 +8,7 @@ export const toArray = (value: any) => {
8
8
9
9
export class ArraySet < T > {
10
10
value : T [ ]
11
+ batchDeleting = false
11
12
constructor ( value : T [ ] = [ ] ) {
12
13
this . value = value
13
14
}
@@ -23,6 +24,7 @@ export class ArraySet<T> {
23
24
}
24
25
25
26
delete ( item : T ) {
27
+ if ( this . batchDeleting ) return //批量删除时禁止单独删除,会影响计数执行器
26
28
const index = this . value . indexOf ( item )
27
29
if ( index > - 1 ) {
28
30
this . value . splice ( index , 1 )
@@ -38,12 +40,14 @@ export class ArraySet<T> {
38
40
39
41
forEachDelete ( callback : ( value : T ) => void ) {
40
42
if ( this . value . length === 0 ) return
43
+ this . batchDeleting = true
41
44
for ( let index = 0 ; index < this . value . length ; index ++ ) {
42
45
const item = this . value [ index ]
43
46
this . value . splice ( index , 1 )
44
47
callback ( item )
45
48
index --
46
49
}
50
+ this . batchDeleting = false
47
51
}
48
52
49
53
clear ( ) {
You can’t perform that action at this time.
0 commit comments