From e6224f4256be2fdac3651ade87f9f91ccf6def71 Mon Sep 17 00:00:00 2001 From: bcq028 <108849949+bcq028@users.noreply.github.com> Date: Fri, 21 Oct 2022 15:25:06 +0800 Subject: [PATCH] fix(reactivity): enable trigger when use str to set length of arr (#6810) Co-authored-by: Anthony Fu --- 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..a322c7209f4 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) } })