Quellcode durchsuchen

fix(shallowReactive): should track value if already reactive when set in shallowReactive

Evan You vor 2 Jahren
Ursprung
Commit
0ad8e8d94f
2 geänderte Dateien mit 6 neuen und 5 gelöschten Zeilen
  1. 2 2
      src/core/instance/state.ts
  2. 4 3
      src/core/observer/index.ts

+ 2 - 2
src/core/instance/state.ts

@@ -110,10 +110,10 @@ function initProps(vm: Component, propsOptions: Object) {
             )
           }
         },
-        true
+        true /* shallow */
       )
     } else {
-      defineReactive(props, key, value, undefined, true)
+      defineReactive(props, key, value, undefined, true /* shallow */)
     }
     // static props are already proxied on the component's prototype
     // during Vue.extend(). We only need to proxy props defined at

+ 4 - 3
src/core/observer/index.ts

@@ -131,7 +131,8 @@ export function defineReactive(
   val?: any,
   customSetter?: Function | null,
   shallow?: boolean,
-  mock?: boolean
+  mock?: boolean,
+  observeEvenIfShallow = false
 ) {
   const dep = new Dep()
 
@@ -150,7 +151,7 @@ export function defineReactive(
     val = obj[key]
   }
 
-  let childOb = !shallow && observe(val, false, mock)
+  let childOb = shallow ? val && val.__ob__ : observe(val, false, mock)
   Object.defineProperty(obj, key, {
     enumerable: true,
     configurable: true,
@@ -194,7 +195,7 @@ export function defineReactive(
       } else {
         val = newVal
       }
-      childOb = !shallow && observe(newVal, false, mock)
+      childOb = shallow ? newVal && newVal.__ob__ : observe(newVal, false, mock)
       if (__DEV__) {
         dep.notify({
           type: TriggerOpTypes.SET,