Skip to content

Commit 9c304bf

Browse files
committed
fix(reactivity): differentiate shallow/deep proxies of same target when nested in reactive
fix #5271
1 parent 9fda941 commit 9c304bf

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

packages/reactivity/__tests__/shallowReactive.spec.ts

+20
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,26 @@ describe('shallowReactive', () => {
3535
expect(isShallow(shallowReadonly({}))).toBe(true)
3636
})
3737

38+
// #5271
39+
test('should respect shallow reactive nested inside reactive on reset', () => {
40+
const r = reactive({ foo: shallowReactive({ bar: {} }) })
41+
expect(isShallow(r.foo)).toBe(true)
42+
expect(isReactive(r.foo.bar)).toBe(false)
43+
44+
r.foo = shallowReactive({ bar: {} })
45+
expect(isShallow(r.foo)).toBe(true)
46+
expect(isReactive(r.foo.bar)).toBe(false)
47+
})
48+
49+
test('should respect shallow/deep versions of same target on access', () => {
50+
const original = {}
51+
const shallow = shallowReactive(original)
52+
const deep = reactive(original)
53+
const r = reactive({ shallow, deep })
54+
expect(r.shallow).toBe(shallow)
55+
expect(r.deep).toBe(deep)
56+
})
57+
3858
describe('collections', () => {
3959
test('should be reactive', () => {
4060
const shallowSet = shallowReactive(new Set())

packages/reactivity/src/baseHandlers.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import {
88
reactiveMap,
99
shallowReactiveMap,
1010
shallowReadonlyMap,
11-
isReadonly
11+
isReadonly,
12+
isShallow
1213
} from './reactive'
1314
import { TrackOpTypes, TriggerOpTypes } from './operations'
1415
import {
@@ -150,8 +151,10 @@ function createSetter(shallow = false) {
150151
): boolean {
151152
let oldValue = (target as any)[key]
152153
if (!shallow && !isReadonly(value)) {
153-
value = toRaw(value)
154-
oldValue = toRaw(oldValue)
154+
if (!isShallow(value)) {
155+
value = toRaw(value)
156+
oldValue = toRaw(oldValue)
157+
}
155158
if (!isArray(target) && isRef(oldValue) && !isRef(value)) {
156159
oldValue.value = value
157160
return true

0 commit comments

Comments
 (0)