From a310d3c761323c3a3117711284c207801348eadd Mon Sep 17 00:00:00 2001 From: Caleb Hearon Date: Fri, 13 Aug 2021 14:18:48 -0400 Subject: [PATCH] fix: don't invoke Vue getters in settter Fixes #498 --- src/reactivity/reactive.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/reactivity/reactive.ts b/src/reactivity/reactive.ts index 7599ab68..ee8ecc0d 100644 --- a/src/reactivity/reactive.ts +++ b/src/reactivity/reactive.ts @@ -80,12 +80,14 @@ export function defineAccessControl(target: AnyObject, key: any, val?: any) { } } + let valIsRef = isRef(val) + setupAccessControl(val) proxy(target, key, { get: function getterHandler() { const value = getter ? getter.call(target) : val // if the key is equal to RefKey, skip the unwrap logic - if (key !== RefKey && isRef(value)) { + if (key !== RefKey && valIsRef) { return value.value } else { return value @@ -94,16 +96,17 @@ export function defineAccessControl(target: AnyObject, key: any, val?: any) { set: function setterHandler(newVal: any) { if (getter && !setter) return - const value = getter ? getter.call(target) : val // If the key is equal to RefKey, skip the unwrap logic // If and only if "value" is ref and "newVal" is not a ref, // the assignment should be proxied to "value" ref. - if (key !== RefKey && isRef(value) && !isRef(newVal)) { - value.value = newVal + if (key !== RefKey && valIsRef && !isRef(newVal)) { + val.value = newVal } else if (setter) { setter.call(target, newVal) + valIsRef = isRef(newVal) } else { val = newVal + valIsRef = isRef(newVal) } setupAccessControl(newVal) },