refactor(reactivity): improve nested readonly ref set check

ref #9094
This commit is contained in:
Evan You 2023-12-11 18:40:25 +08:00
parent 9d1ca320c4
commit ef432bda77
1 changed files with 7 additions and 5 deletions

View File

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