1
- import { effect , ReactiveEffect , activeEffect } from './effect'
1
+ import { effect , ReactiveEffect , trigger , track } from './effect'
2
+ import { TriggerOpTypes , TrackOpTypes } from './operations'
2
3
import { Ref , UnwrapRef } from './ref'
3
4
import { isFunction , NOOP } from '@vue/shared'
4
5
@@ -42,16 +43,20 @@ export function computed<T>(
42
43
43
44
let dirty = true
44
45
let value : T
46
+ let computed : ComputedRef < T >
45
47
46
48
const runner = effect ( getter , {
47
49
lazy : true ,
48
50
// mark effect as computed so that it gets priority during trigger
49
51
computed : true ,
50
52
scheduler : ( ) => {
51
- dirty = true
53
+ if ( ! dirty ) {
54
+ dirty = true
55
+ trigger ( computed , TriggerOpTypes . SET , 'value' )
56
+ }
52
57
}
53
58
} )
54
- return {
59
+ computed = {
55
60
_isRef : true ,
56
61
// expose effect so computed can be stopped
57
62
effect : runner ,
@@ -60,27 +65,12 @@ export function computed<T>(
60
65
value = runner ( )
61
66
dirty = false
62
67
}
63
- // When computed effects are accessed in a parent effect, the parent
64
- // should track all the dependencies the computed property has tracked.
65
- // This should also apply for chained computed properties.
66
- trackChildRun ( runner )
68
+ track ( computed , TrackOpTypes . GET , 'value' )
67
69
return value
68
70
} ,
69
71
set value ( newValue : T ) {
70
72
setter ( newValue )
71
73
}
72
74
} as any
73
- }
74
-
75
- function trackChildRun ( childRunner : ReactiveEffect ) {
76
- if ( activeEffect === undefined ) {
77
- return
78
- }
79
- for ( let i = 0 ; i < childRunner . deps . length ; i ++ ) {
80
- const dep = childRunner . deps [ i ]
81
- if ( ! dep . has ( activeEffect ) ) {
82
- dep . add ( activeEffect )
83
- activeEffect . deps . push ( dep )
84
- }
85
- }
75
+ return computed
86
76
}
0 commit comments