美文网首页
vue源码分析(二十四)Vue之指令(v-for)

vue源码分析(二十四)Vue之指令(v-for)

作者: vue爱好者 | 来源:发表于2020-04-21 20:54 被阅读0次

    我们打开文件 src/core/instance/render-helpers/render-list.js

    /* @flow */
    
    import { isObject, isDef, hasSymbol } 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 (hasSymbol && val[Symbol.iterator]) {
          ret = []
          const iterator: Iterator<any> = val[Symbol.iterator]()
          let result = iterator.next()
          while (!result.done) {
            ret.push(render(result.value, ret.length))
            result = iterator.next()
          }
        } 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 = []
      }
      (ret: any)._isVList = true
      return ret
    }
    

    通过上面是几个if、if else可以看到val可以为三种类型ArrayStringNumberObject

    Array & String

    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)
        }
      }
    

    render函数里面其实的调用了 toString(_s)VNode(_v)createElement(_c)最终返回了一个虚拟的VNode。

    相关文章

      网友评论

          本文标题:vue源码分析(二十四)Vue之指令(v-for)

          本文链接:https://www.haomeiwen.com/subject/caqjuhtx.html