Skip to content

Commit 02f355e

Browse files
authored
fix(v-for): handle and warn when v-for receives non-integer range number (#2247)
close #2245
1 parent 8539c0b commit 02f355e

File tree

4 files changed

+24
-0
lines changed

4 files changed

+24
-0
lines changed

packages/runtime-core/__tests__/helpers/renderList.spec.ts

+7
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ describe('renderList', () => {
2121
])
2222
})
2323

24+
it('should warn when given a non-integer N', () => {
25+
renderList(3.1, () => {})
26+
expect(
27+
`The v-for range expect an integer value but got 3.1.`
28+
).toHaveBeenWarned()
29+
})
30+
2431
it('should render properties in an object', () => {
2532
expect(
2633
renderList(

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

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { VNodeChild } from '../vnode'
22
import { isArray, isString, isObject } from '@vue/shared'
3+
import { warn } from '../warning'
34

45
/**
56
* v-for string
@@ -60,6 +61,10 @@ export function renderList(
6061
ret[i] = renderItem(source[i], i)
6162
}
6263
} else if (typeof source === 'number') {
64+
if (__DEV__ && !Number.isInteger(source)) {
65+
warn(`The v-for range expect an integer value but got ${source}.`)
66+
return []
67+
}
6368
ret = new Array(source)
6469
for (let i = 0; i < source; i++) {
6570
ret[i] = renderItem(i + 1, i)

packages/server-renderer/__tests__/ssrRenderList.spec.ts

+7
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ describe('ssr: renderList', () => {
2424
expect(stack).toEqual(['node 0: 1', 'node 1: 2', 'node 2: 3'])
2525
})
2626

27+
it('should warn when given a non-integer N', () => {
28+
ssrRenderList(3.1, () => {})
29+
expect(
30+
`The v-for range expect an integer value but got 3.1.`
31+
).toHaveBeenWarned()
32+
})
33+
2734
it('should render properties in an object', () => {
2835
ssrRenderList({ a: 1, b: 2, c: 3 }, (item, key, index) =>
2936
stack.push(`node ${index}/${key}: ${item}`)

packages/server-renderer/src/helpers/ssrRenderList.ts

+5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { isArray, isString, isObject } from '@vue/shared'
2+
import { warn } from '@vue/runtime-core'
23

34
export function ssrRenderList(
45
source: unknown,
@@ -9,6 +10,10 @@ export function ssrRenderList(
910
renderItem(source[i], i)
1011
}
1112
} else if (typeof source === 'number') {
13+
if (__DEV__ && !Number.isInteger(source)) {
14+
warn(`The v-for range expect an integer value but got ${source}.`)
15+
return
16+
}
1217
for (let i = 0; i < source; i++) {
1318
renderItem(i + 1, i)
1419
}

0 commit comments

Comments
 (0)