Skip to content

Commit 13d31d5

Browse files
committed
perf: avoid array map in v-for read array
1 parent b868e15 commit 13d31d5

File tree

3 files changed

+13
-5
lines changed

3 files changed

+13
-5
lines changed

packages/reactivity/__benchmarks__/reactiveArray.bench.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { bench } from 'vitest'
2-
import { effect, reactive, reactiveReadArray, shallowReadArray } from '../src'
2+
import { effect, reactive, shallowReadArray } from '../src'
33

44
for (let amount = 1e1; amount < 1e4; amount *= 10) {
55
{

packages/reactivity/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ export {
3131
shallowReadonly,
3232
markRaw,
3333
toRaw,
34+
toReactive,
35+
toReadonly,
3436
type Raw,
3537
type DeepReadonly,
3638
type ShallowReactive,

packages/runtime-core/src/helpers/renderList.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { VNode, VNodeChild } from '../vnode'
2-
import { reactiveReadArray } from '@vue/reactivity'
2+
import { isReactive, shallowReadArray, toReactive } from '@vue/reactivity'
33
import { isArray, isObject, isString } from '@vue/shared'
44
import { warn } from '../warning'
55

@@ -60,14 +60,20 @@ export function renderList(
6060
let ret: VNodeChild[]
6161
const cached = (cache && cache[index!]) as VNode[] | undefined
6262
const sourceIsArray = isArray(source)
63+
const sourceIsReactiveArray = sourceIsArray && isReactive(source)
6364

6465
if (sourceIsArray || isString(source)) {
65-
if (sourceIsArray) {
66-
source = reactiveReadArray(source)
66+
if (sourceIsReactiveArray) {
67+
source = shallowReadArray(source)
6768
}
6869
ret = new Array(source.length)
6970
for (let i = 0, l = source.length; i < l; i++) {
70-
ret[i] = renderItem(source[i], i, undefined, cached && cached[i])
71+
ret[i] = renderItem(
72+
sourceIsReactiveArray ? toReactive(source[i]) : source[i],
73+
i,
74+
undefined,
75+
cached && cached[i],
76+
)
7177
}
7278
} else if (typeof source === 'number') {
7379
if (__DEV__ && !Number.isInteger(source)) {

0 commit comments

Comments
 (0)