Skip to content

Commit 9438cc5

Browse files
authored
fix(runtime-core): warn about negative number in v-for (#12308)
1 parent 1398bf8 commit 9438cc5

File tree

4 files changed

+54
-13
lines changed

4 files changed

+54
-13
lines changed

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

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,26 @@ describe('renderList', () => {
2929
})
3030

3131
it('should warn when given a non-integer N', () => {
32-
try {
33-
renderList(3.1, () => {})
34-
} catch (e) {}
32+
expect(renderList(3.1, () => {})).toEqual([])
3533
expect(
36-
`The v-for range expect an integer value but got 3.1.`,
34+
`The v-for range expects a positive integer value but got 3.1.`,
3735
).toHaveBeenWarned()
3836
})
3937

38+
it('should warn when given a negative N', () => {
39+
expect(renderList(-1, () => {})).toEqual([])
40+
expect(
41+
`The v-for range expects a positive integer value but got -1.`,
42+
).toHaveBeenWarned()
43+
})
44+
45+
it('should not warn when given 0', () => {
46+
renderList(0, () => {})
47+
expect(
48+
`The v-for range expects a positive integer value but got 0.`,
49+
).not.toHaveBeenWarned()
50+
})
51+
4052
it('should render properties in an object', () => {
4153
expect(
4254
renderList(
@@ -58,6 +70,10 @@ describe('renderList', () => {
5870
).toEqual(['node 0: 1', 'node 1: 2', 'node 2: 3'])
5971
})
6072

73+
it('should return empty array when source is 0', () => {
74+
expect(renderList(0, (item, index) => `node ${index}: ${item}`)).toEqual([])
75+
})
76+
6177
it('should return empty array when source is undefined', () => {
6278
expect(
6379
renderList(undefined, (item, index) => `node ${index}: ${item}`),

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,16 @@ export function renderList(
9191
)
9292
}
9393
} else if (typeof source === 'number') {
94-
if (__DEV__ && !Number.isInteger(source)) {
95-
warn(`The v-for range expect an integer value but got ${source}.`)
96-
}
97-
ret = new Array(source)
98-
for (let i = 0; i < source; i++) {
99-
ret[i] = renderItem(i + 1, i, undefined, cached && cached[i])
94+
if (__DEV__ && (!Number.isInteger(source) || source < 0)) {
95+
warn(
96+
`The v-for range expects a positive integer value but got ${source}.`,
97+
)
98+
ret = []
99+
} else {
100+
ret = new Array(source)
101+
for (let i = 0; i < source; i++) {
102+
ret[i] = renderItem(i + 1, i, undefined, cached && cached[i])
103+
}
100104
}
101105
} else if (isObject(source)) {
102106
if (source[Symbol.iterator as any]) {

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,24 @@ describe('ssr: renderList', () => {
2727
it('should warn when given a non-integer N', () => {
2828
ssrRenderList(3.1, () => {})
2929
expect(
30-
`The v-for range expect an integer value but got 3.1.`,
30+
`The v-for range expects a positive integer value but got 3.1.`,
3131
).toHaveBeenWarned()
3232
})
3333

34+
it('should warn when given a negative N', () => {
35+
ssrRenderList(-1, () => {})
36+
expect(
37+
`The v-for range expects a positive integer value but got -1.`,
38+
).toHaveBeenWarned()
39+
})
40+
41+
it('should not warn when given 0', () => {
42+
ssrRenderList(0, () => {})
43+
expect(
44+
`The v-for range expects a positive integer value but got 0.`,
45+
).not.toHaveBeenWarned()
46+
})
47+
3448
it('should render properties in an object', () => {
3549
ssrRenderList({ a: 1, b: 2, c: 3 }, (item, key, index) =>
3650
stack.push(`node ${index}/${key}: ${item}`),
@@ -51,6 +65,11 @@ describe('ssr: renderList', () => {
5165
expect(stack).toEqual(['node 0: 1', 'node 1: 2', 'node 2: 3'])
5266
})
5367

68+
it('should not render items when source is 0', () => {
69+
ssrRenderList(0, (item, index) => stack.push(`node ${index}: ${item}`))
70+
expect(stack).toEqual([])
71+
})
72+
5473
it('should not render items when source is undefined', () => {
5574
ssrRenderList(undefined, (item, index) =>
5675
stack.push(`node ${index}: ${item}`),

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ export function ssrRenderList(
1010
renderItem(source[i], i)
1111
}
1212
} else if (typeof source === 'number') {
13-
if (__DEV__ && !Number.isInteger(source)) {
14-
warn(`The v-for range expect an integer value but got ${source}.`)
13+
if (__DEV__ && (!Number.isInteger(source) || source < 0)) {
14+
warn(
15+
`The v-for range expects a positive integer value but got ${source}.`,
16+
)
1517
return
1618
}
1719
for (let i = 0; i < source; i++) {

0 commit comments

Comments
 (0)