Skip to content

Commit 475977a

Browse files
authored
fix(reactivity): handle non-array arguments in reactive concat method (#11794)
close #11792
1 parent 6402b98 commit 475977a

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

packages/reactivity/__tests__/reactiveArray.spec.ts

+21-5
Original file line numberDiff line numberDiff line change
@@ -303,19 +303,35 @@ describe('reactivity/reactive/Array', () => {
303303
const a2 = reactive([{ val: 3 }])
304304
const a3 = [4, 5]
305305

306-
let result = computed(() => a1.concat(a2, a3))
307-
expect(result.value).toStrictEqual([1, { val: 2 }, { val: 3 }, 4, 5])
306+
let result = computed(() => a1.concat(a2, a3, 6, { val: 7 }))
307+
expect(result.value).toStrictEqual([
308+
1,
309+
{ val: 2 },
310+
{ val: 3 },
311+
4,
312+
5,
313+
6,
314+
{ val: 7 },
315+
])
308316
expect(isReactive(result.value[1])).toBe(false)
309317
expect(isReactive(result.value[2])).toBe(true)
318+
expect(isReactive(result.value[6])).toBe(false)
310319

311320
a1.shift()
312-
expect(result.value).toStrictEqual([{ val: 2 }, { val: 3 }, 4, 5])
321+
expect(result.value).toStrictEqual([
322+
{ val: 2 },
323+
{ val: 3 },
324+
4,
325+
5,
326+
6,
327+
{ val: 7 },
328+
])
313329

314330
a2.pop()
315-
expect(result.value).toStrictEqual([{ val: 2 }, 4, 5])
331+
expect(result.value).toStrictEqual([{ val: 2 }, 4, 5, 6, { val: 7 }])
316332

317333
a3.pop()
318-
expect(result.value).toStrictEqual([{ val: 2 }, 4, 5])
334+
expect(result.value).toStrictEqual([{ val: 2 }, 4, 5, 6, { val: 7 }])
319335
})
320336

321337
test('entries', () => {

packages/reactivity/src/arrayInstrumentations.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { TrackOpTypes } from './constants'
22
import { endBatch, pauseTracking, resetTracking, startBatch } from './effect'
33
import { isProxy, isShallow, toRaw, toReactive } from './reactive'
44
import { ARRAY_ITERATE_KEY, track } from './dep'
5+
import { isArray } from '@vue/shared'
56

67
/**
78
* Track array iteration and return:
@@ -30,9 +31,9 @@ export const arrayInstrumentations: Record<string | symbol, Function> = <any>{
3031
return iterator(this, Symbol.iterator, toReactive)
3132
},
3233

33-
concat(...args: unknown[][]) {
34+
concat(...args: unknown[]) {
3435
return reactiveReadArray(this).concat(
35-
...args.map(x => reactiveReadArray(x)),
36+
...args.map(x => (isArray(x) ? reactiveReadArray(x) : x)),
3637
)
3738
},
3839

0 commit comments

Comments
 (0)