File tree 2 files changed +29
-4
lines changed
2 files changed +29
-4
lines changed Original file line number Diff line number Diff line change @@ -12,7 +12,8 @@ import {
12
12
ITERATE_KEY ,
13
13
DebuggerEvent ,
14
14
TrackOpTypes ,
15
- TriggerOpTypes
15
+ TriggerOpTypes ,
16
+ triggerRef
16
17
} from '@vue/reactivity'
17
18
18
19
// reference: https://vue-composition-api-rfc.netlify.com/api.html#watch
@@ -637,4 +638,27 @@ describe('api: watch', () => {
637
638
v . value ++
638
639
expect ( calls ) . toBe ( 1 )
639
640
} )
641
+
642
+ test ( 'should force trigger on triggerRef when watching a ref' , async ( ) => {
643
+ const v = ref ( { a : 1 } )
644
+ let sideEffect = 0
645
+ watch ( v , obj => {
646
+ sideEffect = obj . a
647
+ } )
648
+
649
+ v . value = v . value
650
+ await nextTick ( )
651
+ // should not trigger
652
+ expect ( sideEffect ) . toBe ( 0 )
653
+
654
+ v . value . a ++
655
+ await nextTick ( )
656
+ // should not trigger
657
+ expect ( sideEffect ) . toBe ( 0 )
658
+
659
+ triggerRef ( v )
660
+ await nextTick ( )
661
+ // should trigger now
662
+ expect ( sideEffect ) . toBe ( 2 )
663
+ } )
640
664
} )
Original file line number Diff line number Diff line change @@ -159,8 +159,9 @@ function doWatch(
159
159
}
160
160
161
161
let getter : ( ) => any
162
- if ( isRef ( source ) ) {
163
- getter = ( ) => source . value
162
+ const isRefSource = isRef ( source )
163
+ if ( isRefSource ) {
164
+ getter = ( ) => ( source as Ref ) . value
164
165
} else if ( isReactive ( source ) ) {
165
166
getter = ( ) => source
166
167
deep = true
@@ -239,7 +240,7 @@ function doWatch(
239
240
if ( cb ) {
240
241
// watch(source, cb)
241
242
const newValue = runner ( )
242
- if ( deep || hasChanged ( newValue , oldValue ) ) {
243
+ if ( deep || isRefSource || hasChanged ( newValue , oldValue ) ) {
243
244
// cleanup before running cb again
244
245
if ( cleanup ) {
245
246
cleanup ( )
You can’t perform that action at this time.
0 commit comments