Skip to content

Commit 80e1693

Browse files
authored
fix(reactivity): replaced ref in reactive object should be tracked (#1058)
1 parent d437a01 commit 80e1693

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

packages/reactivity/__tests__/reactive.spec.ts

+15
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,21 @@ describe('reactivity/reactive', () => {
131131
expect(typeof obj.b).toBe(`number`)
132132
})
133133

134+
test('should allow setting property from a ref to another ref', () => {
135+
const foo = ref(0)
136+
const bar = ref(1)
137+
const observed = reactive({ a: foo })
138+
const dummy = computed(() => observed.a)
139+
expect(dummy.value).toBe(0)
140+
141+
// @ts-ignore
142+
observed.a = bar
143+
expect(dummy.value).toBe(1)
144+
145+
bar.value++
146+
expect(dummy.value).toBe(2)
147+
})
148+
134149
test('non-observable values', () => {
135150
const assertValue = (value: any) => {
136151
reactive(value)

packages/reactivity/src/baseHandlers.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -66,22 +66,21 @@ function createGetter(isReadonly = false, shallow = false) {
6666
return res
6767
}
6868

69+
!isReadonly && track(target, TrackOpTypes.GET, key)
70+
6971
if (shallow) {
70-
!isReadonly && track(target, TrackOpTypes.GET, key)
7172
return res
7273
}
7374

7475
if (isRef(res)) {
7576
if (targetIsArray) {
76-
!isReadonly && track(target, TrackOpTypes.GET, key)
7777
return res
7878
} else {
7979
// ref unwrapping, only for Objects, not for Arrays.
8080
return res.value
8181
}
8282
}
8383

84-
!isReadonly && track(target, TrackOpTypes.GET, key)
8584
return isObject(res)
8685
? isReadonly
8786
? // need to lazy access readonly and reactive here to avoid

0 commit comments

Comments
 (0)