Skip to content

Commit 4be1037

Browse files
authored
fix(reactivity): ensure readonly refs can be replaced with new refs in reactive objects (#5310)
fix #5307
1 parent 059c63e commit 4be1037

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

packages/reactivity/__tests__/readonly.spec.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ describe('reactivity/readonly', () => {
476476
expect(isReadonly(rr.foo)).toBe(true)
477477
})
478478

479-
test('attemptingt to write to a readonly ref nested in a reactive object should fail', () => {
479+
test('attemptingt to write plain value to a readonly ref nested in a reactive object should fail', () => {
480480
const r = ref(false)
481481
const ror = readonly(r)
482482
const obj = reactive({ ror })
@@ -486,4 +486,15 @@ describe('reactivity/readonly', () => {
486486

487487
expect(obj.ror).toBe(false)
488488
})
489+
test('replacing a readonly ref nested in a reactive object with a new ref', () => {
490+
const r = ref(false)
491+
const ror = readonly(r)
492+
const obj = reactive({ ror })
493+
try {
494+
obj.ror = ref(true) as unknown as boolean
495+
} catch (e) {}
496+
497+
expect(obj.ror).toBe(true)
498+
expect(toRaw(obj).ror).not.toBe(ror) // ref successfully replaced
499+
})
489500
})

packages/reactivity/src/baseHandlers.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ function createSetter(shallow = false) {
150150
receiver: object
151151
): boolean {
152152
let oldValue = (target as any)[key]
153-
if (isReadonly(oldValue) && isRef(oldValue)) {
153+
if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) {
154154
return false
155155
}
156156
if (!shallow && !isReadonly(value)) {

0 commit comments

Comments
 (0)