]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
feat: renderList helper for v-for
authorEvan You <yyx990803@gmail.com>
Wed, 25 Sep 2019 01:32:29 +0000 (21:32 -0400)
committerEvan You <yyx990803@gmail.com>
Wed, 25 Sep 2019 01:32:29 +0000 (21:32 -0400)
packages/runtime-core/src/helpers/renderList.ts

index 7a715be29fdcac410c4a2283b46c1ea00e198104..ea0b6f89f322ebc39b2bbd4fc8d45975b4e632cb 100644 (file)
@@ -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<any> = 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
+}