Skip to content

Commit 9797485

Browse files
committed
fix(reactivity): mutating a readonly ref nested in a reactive object should fail.
fix: #5042
1 parent 2d4f455 commit 9797485

File tree

2 files changed

+14
-0
lines changed

2 files changed

+14
-0
lines changed

packages/reactivity/__tests__/readonly.spec.ts

Lines changed: 11 additions & 0 deletions
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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ function createSetter(shallow = false) {
147147
receiver: object
148148
): boolean {
149149
let oldValue = (target as any)[key]
150+
if (isReadonly(oldValue) && isRef(oldValue)) {
151+
return false
152+
}
150153
if (!shallow && !isReadonly(value)) {
151154
value = toRaw(value)
152155
oldValue = toRaw(oldValue)

0 commit comments

Comments
 (0)