fix(reactivity): avoid infinite recursion when mutating ref wrapped in reactive

close #11696
This commit is contained in:
Evan You 2024-08-29 14:10:29 +08:00
parent 9c4c2e51b0
commit 313e4bf552
No known key found for this signature in database
GPG Key ID: 00E9AB7A6704CE0A
2 changed files with 15 additions and 1 deletions

View File

@ -382,4 +382,13 @@ describe('reactivity/reactive', () => {
count++
}
})
// #11696
test('should use correct receiver on set handler for refs', () => {
const a = reactive(ref(1))
effect(() => a.value)
expect(() => {
a.value++
}).not.toThrow()
})
})

View File

@ -165,7 +165,12 @@ class MutableReactiveHandler extends BaseReactiveHandler {
isArray(target) && isIntegerKey(key)
? Number(key) < target.length
: hasOwn(target, key)
const result = Reflect.set(target, key, value, receiver)
const result = Reflect.set(
target,
key,
value,
isRef(target) ? target : receiver,
)
// don't trigger if target is something up in the prototype chain of original
if (target === toRaw(receiver)) {
if (!hadKey) {