| 59 | * Actual implementation |
| 60 | */ |
| 61 | export function renderList( |
| 62 | source: any, |
| 63 | renderItem: (...args: any[]) => VNodeChild, |
| 64 | cache?: any[], |
| 65 | index?: number, |
| 66 | ): VNodeChild[] { |
| 67 | let ret: VNodeChild[] |
| 68 | const cached = (cache && cache[index!]) as VNode[] | undefined |
| 69 | const sourceIsArray = isArray(source) |
| 70 | |
| 71 | if (sourceIsArray || isString(source)) { |
| 72 | const sourceIsReactiveArray = sourceIsArray && isReactive(source) |
| 73 | let needsWrap = false |
| 74 | let isReadonlySource = false |
| 75 | if (sourceIsReactiveArray) { |
| 76 | needsWrap = !isShallow(source) |
| 77 | isReadonlySource = isReadonly(source) |
| 78 | source = shallowReadArray(source) |
| 79 | } |
| 80 | ret = new Array(source.length) |
| 81 | for (let i = 0, l = source.length; i < l; i++) { |
| 82 | ret[i] = renderItem( |
| 83 | needsWrap |
| 84 | ? isReadonlySource |
| 85 | ? toReadonly(toReactive(source[i])) |
| 86 | : toReactive(source[i]) |
| 87 | : source[i], |
| 88 | i, |
| 89 | undefined, |
| 90 | cached && cached[i], |
| 91 | ) |
| 92 | } |
| 93 | } else if (typeof source === 'number') { |
| 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 | } |
| 104 | } |
| 105 | } else if (isObject(source)) { |
| 106 | if (source[Symbol.iterator as any]) { |
| 107 | ret = Array.from(source as Iterable<any>, (item, i) => |
| 108 | renderItem(item, i, undefined, cached && cached[i]), |
| 109 | ) |
| 110 | } else { |
| 111 | const keys = Object.keys(source) |
| 112 | ret = new Array(keys.length) |
| 113 | for (let i = 0, l = keys.length; i < l; i++) { |
| 114 | const key = keys[i] |
| 115 | ret[i] = renderItem(source[key], key, i, cached && cached[i]) |
| 116 | } |
| 117 | } |
| 118 | } else { |