fix(reactivity): should trigger all effects when array length is mutated (#754)

This commit is contained in:
guaijie 2020-02-21 18:38:07 +08:00 committed by GitHub
parent c54aa43fa7
commit 5fac65589b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 2 deletions

View File

@ -737,6 +737,30 @@ describe('reactivity/effect', () => {
expect(fnSpy).toHaveBeenCalledTimes(1)
})
it('should trigger all effects when array lenght is set 0', () => {
const observed: any = reactive([1])
let dummy, record
effect(() => {
dummy = observed.length
})
effect(() => {
record = observed[0]
})
expect(dummy).toBe(1)
expect(record).toBe(1)
observed[1] = 2
expect(observed[1]).toBe(2)
observed.unshift(3)
expect(dummy).toBe(3)
expect(record).toBe(3)
observed.length = 0
expect(dummy).toBe(0)
expect(record).toBeUndefined()
})
it('should handle self dependency mutations', () => {
const count = ref(0)
effect(() => {

View File

@ -174,8 +174,9 @@ export function trigger(
}
const effects = new Set<ReactiveEffect>()
const computedRunners = new Set<ReactiveEffect>()
if (type === TriggerOpTypes.CLEAR) {
// collection being cleared, trigger all effects for target
if (type === TriggerOpTypes.CLEAR || (key === 'length' && isArray(target))) {
// collection being cleared or Array length mutation
// trigger all effects for target
depsMap.forEach(dep => {
addRunners(effects, computedRunners, dep)
})