receiver: object
): boolean {
let oldValue = (target as any)[key]
- if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) {
- return false
- }
if (!this._shallow) {
+ const isOldValueReadonly = isReadonly(oldValue)
if (!isShallow(value) && !isReadonly(value)) {
oldValue = toRaw(oldValue)
value = toRaw(value)
}
if (!isArray(target) && isRef(oldValue) && !isRef(value)) {
- oldValue.value = value
- return true
+ if (isOldValueReadonly) {
+ return false
+ } else {
+ oldValue.value = value
+ return true
+ }
}
} else {
// in shallow mode, objects are set as-is regardless of reactive or not