fix(reactivity): enable trigger when use str to set length of arr (#6810)

Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
This commit is contained in:
bcq028 2022-10-21 15:25:06 +08:00 committed by GitHub
parent e5fc7dcc02
commit e6224f4256
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 2 deletions

View File

@ -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())

View File

@ -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)
}
})