From: Evan You Date: Wed, 25 Sep 2019 01:32:29 +0000 (-0400) Subject: feat: renderList helper for v-for X-Git-Tag: v3.0.0-alpha.0~703 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6ad84614f7384947663852c2c437d9ebcefa7472;p=thirdparty%2Fvuejs%2Fcore.git feat: renderList helper for v-for --- diff --git a/packages/runtime-core/src/helpers/renderList.ts b/packages/runtime-core/src/helpers/renderList.ts index 7a715be29f..ea0b6f89f3 100644 --- a/packages/runtime-core/src/helpers/renderList.ts +++ b/packages/runtime-core/src/helpers/renderList.ts @@ -1,2 +1,36 @@ -// TODO -export function renderList() {} +import { VNodeChild } from '../vnode' +import { isArray, isString, isObject } from '@vue/shared' + +export function renderList( + source: any, + renderItem: (value: any, key: string | number, index?: number) => VNodeChild +): VNodeChild[] { + let ret: VNodeChild[] = [] + if (isArray(source) || isString(source)) { + for (let i = 0, l = source.length; i < l; i++) { + ret.push(renderItem(source[i], i)) + } + } else if (typeof source === 'number') { + for (let i = 0; i < source; i++) { + ret.push(renderItem(i + 1, i)) + } + } else if (isObject(source)) { + if (source[Symbol.iterator as any]) { + ret = [] + const iterator: Iterator = source[Symbol.iterator as any]() + let result = iterator.next() + while (!result.done) { + ret.push(renderItem(result.value, ret.length)) + result = iterator.next() + } + } else { + const keys = Object.keys(source) + ret = new Array(keys.length) + for (let i = 0, l = keys.length; i < l; i++) { + const key = keys[i] + ret[i] = renderItem(source[key], key, i) + } + } + } + return ret +}