Skip to content

Commit 27fbfbd

Browse files
committed
fix(runtime-core): render context set should not unwrap reactive values
1 parent 012bc5d commit 27fbfbd

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

packages/runtime-core/src/componentProxy.ts

+12-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
ComputedOptions,
99
MethodOptions
1010
} from './apiOptions'
11-
import { UnwrapRef, ReactiveEffect, isRef, toRaw } from '@vue/reactivity'
11+
import { UnwrapRef, ReactiveEffect, isRef, isReactive } from '@vue/reactivity'
1212
import { warn } from './warning'
1313
import { Slots } from './componentSlots'
1414
import {
@@ -169,12 +169,18 @@ export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
169169
if (data !== EMPTY_OBJ && hasOwn(data, key)) {
170170
data[key] = value
171171
} else if (hasOwn(renderContext, key)) {
172-
const oldValue = renderContext[key]
173-
value = toRaw(value)
174-
if (isRef(oldValue) && !isRef(value)) {
175-
oldValue.value = value
176-
} else {
172+
// context is already reactive (user returned reactive object from setup())
173+
// just set directly
174+
if (isReactive(renderContext)) {
177175
renderContext[key] = value
176+
} else {
177+
// handle potential ref set
178+
const oldValue = renderContext[key]
179+
if (isRef(oldValue) && !isRef(value)) {
180+
oldValue.value = value
181+
} else {
182+
renderContext[key] = value
183+
}
178184
}
179185
} else if (key[0] === '$' && key.slice(1) in target) {
180186
__DEV__ &&

0 commit comments

Comments
 (0)