-
-
Notifications
You must be signed in to change notification settings - Fork 33.7k
/
Copy pathrender-list.js
49 lines (47 loc) · 1.19 KB
/
render-list.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/* @flow */
import { isObject, isDef } from 'core/util/index'
/**
* Runtime helper for rendering v-for lists.
*/
export function renderList (
val: any,
render: (
val: any,
keyOrIndex: string | number,
index?: number
) => VNode
): ?Array<VNode> {
let ret: ?Array<VNode>, i, l, keys, key
if (Array.isArray(val) || typeof val === 'string') {
ret = new Array(val.length)
for (i = 0, l = val.length; i < l; i++) {
ret[i] = render(val[i], i)
}
} else if (typeof val === 'number') {
ret = new Array(val)
for (i = 0; i < val; i++) {
ret[i] = render(i + 1, i)
}
} else if (isObject(val)) {
if (typeof Symbol !== 'undefined' && Symbol.iterator && val[Symbol.iterator]) {
ret = []
const iterator = val[Symbol.iterator]()
while (true) {
const value = iterator.next()
if (value.done) break
ret.push(render(value.value, ret.length))
}
} else {
keys = Object.keys(val)
ret = new Array(keys.length)
for (i = 0, l = keys.length; i < l; i++) {
key = keys[i]
ret[i] = render(val[key], key, i)
}
}
}
if (isDef(ret)) {
(ret: any)._isVList = true
}
return ret
}