From: Evan You Date: Mon, 27 Jan 2020 23:05:30 +0000 (-0500) Subject: fix(runtime-core): render context set should not unwrap reactive values X-Git-Tag: v3.0.0-alpha.5~170 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=27fbfbdb8beffc96134c931425f33178c23a72db;p=thirdparty%2Fvuejs%2Fcore.git fix(runtime-core): render context set should not unwrap reactive values --- diff --git a/packages/runtime-core/src/componentProxy.ts b/packages/runtime-core/src/componentProxy.ts index 77fb117e89..5d8d4364a6 100644 --- a/packages/runtime-core/src/componentProxy.ts +++ b/packages/runtime-core/src/componentProxy.ts @@ -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 = { 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__ &&