Skip to content
Permalink
Browse files
fix(reactivity): enable trigger when use str to set length of arr (#6810
)

Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
  • Loading branch information
bcq028 and antfu committed Oct 21, 2022
1 parent e5fc7dc commit e6224f4256be2fdac3651ade87f9f91ccf6def71
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 2 deletions.
@@ -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())
@@ -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)
}
})

0 comments on commit e6224f4

Please sign in to comment.