Skip to content

Commit ced59ab

Browse files
authored
fix(runtime-core): handle shallow reactive arrays in renderList correctly (#11870)
close #11869
1 parent 67d6596 commit ced59ab

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

Diff for: packages/runtime-core/__tests__/helpers/renderList.spec.ts

+9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { isReactive, reactive, shallowReactive } from '../../src/index'
12
import { renderList } from '../../src/helpers/renderList'
23

34
describe('renderList', () => {
@@ -56,4 +57,12 @@ describe('renderList', () => {
5657
renderList(undefined, (item, index) => `node ${index}: ${item}`),
5758
).toEqual([])
5859
})
60+
61+
it('should render items in a reactive array correctly', () => {
62+
const reactiveArray = reactive([{ foo: 1 }])
63+
expect(renderList(reactiveArray, isReactive)).toEqual([true])
64+
65+
const shallowReactiveArray = shallowReactive([{ foo: 1 }])
66+
expect(renderList(shallowReactiveArray, isReactive)).toEqual([false])
67+
})
5968
})

Diff for: packages/runtime-core/src/helpers/renderList.ts

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import type { VNode, VNodeChild } from '../vnode'
2-
import { isReactive, shallowReadArray, toReactive } from '@vue/reactivity'
2+
import {
3+
isReactive,
4+
isShallow,
5+
shallowReadArray,
6+
toReactive,
7+
} from '@vue/reactivity'
38
import { isArray, isObject, isString } from '@vue/shared'
49
import { warn } from '../warning'
510

@@ -63,13 +68,15 @@ export function renderList(
6368

6469
if (sourceIsArray || isString(source)) {
6570
const sourceIsReactiveArray = sourceIsArray && isReactive(source)
71+
let needsWrap = false
6672
if (sourceIsReactiveArray) {
73+
needsWrap = !isShallow(source)
6774
source = shallowReadArray(source)
6875
}
6976
ret = new Array(source.length)
7077
for (let i = 0, l = source.length; i < l; i++) {
7178
ret[i] = renderItem(
72-
sourceIsReactiveArray ? toReactive(source[i]) : source[i],
79+
needsWrap ? toReactive(source[i]) : source[i],
7380
i,
7481
undefined,
7582
cached && cached[i],

0 commit comments

Comments
 (0)