]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-core): render context set should not unwrap reactive values
authorEvan You <yyx990803@gmail.com>
Mon, 27 Jan 2020 23:05:30 +0000 (18:05 -0500)
committerEvan You <yyx990803@gmail.com>
Mon, 27 Jan 2020 23:05:30 +0000 (18:05 -0500)
packages/runtime-core/src/componentProxy.ts

index 77fb117e89973deee08d089b57149d99b18f07ce..5d8d4364a6353e820329295f59f26cd72e69d8fc 100644 (file)
@@ -8,7 +8,7 @@ import {
   ComputedOptions,
   MethodOptions
 } from './apiOptions'
-import { UnwrapRef, ReactiveEffect, isRef, toRaw } from '@vue/reactivity'
+import { UnwrapRef, ReactiveEffect, isRef, isReactive } from '@vue/reactivity'
 import { warn } from './warning'
 import { Slots } from './componentSlots'
 import {
@@ -169,12 +169,18 @@ export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
     if (data !== EMPTY_OBJ && hasOwn(data, key)) {
       data[key] = value
     } else if (hasOwn(renderContext, key)) {
-      const oldValue = renderContext[key]
-      value = toRaw(value)
-      if (isRef(oldValue) && !isRef(value)) {
-        oldValue.value = value
-      } else {
+      // context is already reactive (user returned reactive object from setup())
+      // just set directly
+      if (isReactive(renderContext)) {
         renderContext[key] = value
+      } else {
+        // handle potential ref set
+        const oldValue = renderContext[key]
+        if (isRef(oldValue) && !isRef(value)) {
+          oldValue.value = value
+        } else {
+          renderContext[key] = value
+        }
       }
     } else if (key[0] === '$' && key.slice(1) in target) {
       __DEV__ &&