]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(reactivity): differentiate shallow/deep proxies of same target when nested in...
authorEvan You <yyx990803@gmail.com>
Tue, 18 Jan 2022 01:22:03 +0000 (09:22 +0800)
committerEvan You <yyx990803@gmail.com>
Tue, 18 Jan 2022 01:22:41 +0000 (09:22 +0800)
fix #5271

packages/reactivity/__tests__/shallowReactive.spec.ts
packages/reactivity/src/baseHandlers.ts

index f7c7e07b0558260ddf2366b4e29b8bc8cf933735..200aa462496f6d8ee24ad11ce71f43b420184b20 100644 (file)
@@ -35,6 +35,26 @@ describe('shallowReactive', () => {
     expect(isShallow(shallowReadonly({}))).toBe(true)
   })
 
+  // #5271
+  test('should respect shallow reactive nested inside reactive on reset', () => {
+    const r = reactive({ foo: shallowReactive({ bar: {} }) })
+    expect(isShallow(r.foo)).toBe(true)
+    expect(isReactive(r.foo.bar)).toBe(false)
+
+    r.foo = shallowReactive({ bar: {} })
+    expect(isShallow(r.foo)).toBe(true)
+    expect(isReactive(r.foo.bar)).toBe(false)
+  })
+
+  test('should respect shallow/deep versions of same target on access', () => {
+    const original = {}
+    const shallow = shallowReactive(original)
+    const deep = reactive(original)
+    const r = reactive({ shallow, deep })
+    expect(r.shallow).toBe(shallow)
+    expect(r.deep).toBe(deep)
+  })
+
   describe('collections', () => {
     test('should be reactive', () => {
       const shallowSet = shallowReactive(new Set())
index 3d2ba6619737d5369a7dffb49edc15a8fb300116..97acf063f67aaab5ba348964763b62df1e3442bf 100644 (file)
@@ -8,7 +8,8 @@ import {
   reactiveMap,
   shallowReactiveMap,
   shallowReadonlyMap,
-  isReadonly
+  isReadonly,
+  isShallow
 } from './reactive'
 import { TrackOpTypes, TriggerOpTypes } from './operations'
 import {
@@ -150,8 +151,10 @@ function createSetter(shallow = false) {
   ): boolean {
     let oldValue = (target as any)[key]
     if (!shallow && !isReadonly(value)) {
-      value = toRaw(value)
-      oldValue = toRaw(oldValue)
+      if (!isShallow(value)) {
+        value = toRaw(value)
+        oldValue = toRaw(oldValue)
+      }
       if (!isArray(target) && isRef(oldValue) && !isRef(value)) {
         oldValue.value = value
         return true