0cdd10b27bb855e624f22d197426b10dd16157b62dc7943d4ae2765ace6bee5fc0aa8d4959161f1e0d811b7b24cecef7ff36f4be5415754c78c743eca5bef3 1.2 KB

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