Skip to content

Commit e450973

Browse files
authored
fix(reactivity): avoid triggering effects when set fails (#14964)
1 parent 747f57e commit e450973

2 files changed

Lines changed: 23 additions & 1 deletion

File tree

packages/reactivity/__tests__/reactive.spec.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,28 @@ describe('reactivity/reactive', () => {
138138
expect('foo' in original).toBe(false)
139139
})
140140

141+
test('failed set operation should not trigger effects', () => {
142+
const original: any = {}
143+
Object.defineProperty(original, 'foo', {
144+
value: 1,
145+
writable: false,
146+
configurable: true,
147+
})
148+
const observed = reactive(original)
149+
let dummy
150+
let run = 0
151+
effect(() => {
152+
run++
153+
dummy = observed.foo
154+
})
155+
156+
expect(() => {
157+
observed.foo = 2
158+
}).toThrow(TypeError)
159+
expect(dummy).toBe(1)
160+
expect(run).toBe(1)
161+
})
162+
141163
test('original value change should reflect in observed value (Object)', () => {
142164
const original: any = { foo: 1 }
143165
const observed = reactive(original)

packages/reactivity/src/baseHandlers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ class MutableReactiveHandler extends BaseReactiveHandler {
181181
isRef(target) ? target : receiver,
182182
)
183183
// don't trigger if target is something up in the prototype chain of original
184-
if (target === toRaw(receiver)) {
184+
if (target === toRaw(receiver) && result) {
185185
if (!hadKey) {
186186
trigger(target, TriggerOpTypes.ADD, key, value)
187187
} else if (hasChanged(value, oldValue)) {

0 commit comments

Comments
 (0)