Skip to content

Commit 171f5e9

Browse files
authored
fix(reactivity): mutating a readonly ref nested in a reactive object should fail. (#5048)
fix: #5042
1 parent 72130ac commit 171f5e9

File tree

2 files changed

+14
-0
lines changed

2 files changed

+14
-0
lines changed

packages/reactivity/__tests__/readonly.spec.ts

+11
Original file line numberDiff line numberDiff line change
@@ -474,4 +474,15 @@ describe('reactivity/readonly', () => {
474474
expect(rr.foo).toBe(r)
475475
expect(isReadonly(rr.foo)).toBe(true)
476476
})
477+
478+
test('attemptingt to write to a readonly ref nested in a reactive object should fail', () => {
479+
const r = ref(false)
480+
const ror = readonly(r)
481+
const obj = reactive({ ror })
482+
try {
483+
obj.ror = true
484+
} catch (e) {}
485+
486+
expect(obj.ror).toBe(false)
487+
})
477488
})

packages/reactivity/src/baseHandlers.ts

+3
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,9 @@ function createSetter(shallow = false) {
150150
receiver: object
151151
): boolean {
152152
let oldValue = (target as any)[key]
153+
if (isReadonly(oldValue) && isRef(oldValue)) {
154+
return false
155+
}
153156
if (!shallow && !isReadonly(value)) {
154157
if (!isShallow(value)) {
155158
value = toRaw(value)

0 commit comments

Comments
 (0)