From 14ec7df19bbb920f8ee25267088790ad291f1631 Mon Sep 17 00:00:00 2001 From: bcq <3488613264@qq.com> Date: Mon, 3 Oct 2022 12:49:59 +0800 Subject: [PATCH 1/2] fix(reactivity): enable trigger when use str to set length of arr --- packages/reactivity/__tests__/effect.spec.ts | 16 ++++++++++++++++ packages/reactivity/src/effect.ts | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/reactivity/__tests__/effect.spec.ts b/packages/reactivity/__tests__/effect.spec.ts index a66aff278a4..a9b01d3d08e 100644 --- a/packages/reactivity/__tests__/effect.spec.ts +++ b/packages/reactivity/__tests__/effect.spec.ts @@ -922,6 +922,22 @@ describe('reactivity/effect', () => { expect(fnSpy2).toHaveBeenCalledTimes(1) }) + it('should be triggered when set length with string',()=>{ + let ret1='idle' + let ret2='idle' + const arr1=reactive(new Array(11).fill(0)) + const arr2=reactive(new Array(11).fill(0)) + effect(()=>{ + ret1=arr1[10]===undefined?'arr[10] is set to empty':'idle' + }) + effect(()=>{ + ret2=arr2[10]===undefined?'arr[10] is set to empty':'idle' + }) + arr1.length=2 + arr2.length='2' as any + expect(ret1).toBe(ret2) + }) + describe('readonly + reactive for Map', () => { test('should work with readonly(reactive(Map))', () => { const m = reactive(new Map()) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 34b53eb8fef..8a54372cd5b 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -1,5 +1,5 @@ import { TrackOpTypes, TriggerOpTypes } from './operations' -import { extend, isArray, isIntegerKey, isMap } from '@vue/shared' +import { extend, isArray, isIntegerKey, isMap, toNumber } from '@vue/shared' import { EffectScope, recordEffectScope } from './effectScope' import { createDep, @@ -277,7 +277,7 @@ export function trigger( deps = [...depsMap.values()] } else if (key === 'length' && isArray(target)) { depsMap.forEach((dep, key) => { - if (key === 'length' || key >= (newValue as number)) { + if (key === 'length' || key >= toNumber(newValue)) { deps.push(dep) } }) From 53a9032fa5baa9b28a123f35c2e9a08664bdc0b2 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Mon, 3 Oct 2022 15:19:01 +0800 Subject: [PATCH 2/2] chore: format --- packages/reactivity/__tests__/effect.spec.ts | 26 ++++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/reactivity/__tests__/effect.spec.ts b/packages/reactivity/__tests__/effect.spec.ts index a9b01d3d08e..a322c7209f4 100644 --- a/packages/reactivity/__tests__/effect.spec.ts +++ b/packages/reactivity/__tests__/effect.spec.ts @@ -922,19 +922,19 @@ describe('reactivity/effect', () => { expect(fnSpy2).toHaveBeenCalledTimes(1) }) - it('should be triggered when set length with string',()=>{ - let ret1='idle' - let ret2='idle' - const arr1=reactive(new Array(11).fill(0)) - const arr2=reactive(new Array(11).fill(0)) - effect(()=>{ - ret1=arr1[10]===undefined?'arr[10] is set to empty':'idle' - }) - effect(()=>{ - ret2=arr2[10]===undefined?'arr[10] is set to empty':'idle' - }) - arr1.length=2 - arr2.length='2' as any + it('should be triggered when set length with string', () => { + let ret1 = 'idle' + let ret2 = 'idle' + const arr1 = reactive(new Array(11).fill(0)) + const arr2 = reactive(new Array(11).fill(0)) + effect(() => { + ret1 = arr1[10] === undefined ? 'arr[10] is set to empty' : 'idle' + }) + effect(() => { + ret2 = arr2[10] === undefined ? 'arr[10] is set to empty' : 'idle' + }) + arr1.length = 2 + arr2.length = '2' as any expect(ret1).toBe(ret2) })