美文网首页
用vnode实现一个DOM结构

用vnode实现一个DOM结构

作者: 玲儿珑 | 来源:发表于2020-05-20 18:32 被阅读0次

    vnode基本属性的定义可以参见源码:src/vdom/vnode.js里面对于vnode的定义。

    constructor (
        tag?: string,
        data?: VNodeData,         // 关于这个节点的data值,包括attrs,style,hook等
        children?: ?Array<VNode>, // 子vdom节点
        text?: string,        // 文本内容
        elm?: Node,           // 真实的dom节点
        context?: Component,  // 创建这个vdom的上下文
        componentOptions?: VNodeComponentOptions
      ) {
        this.tag = tag
        this.data = data
        this.children = children
        this.text = text
        this.elm = elm
        this.ns = undefined
        this.context = context
        this.functionalContext = undefined
        this.key = data && data.key
        this.componentOptions = componentOptions
        this.componentInstance = undefined
        this.parent = undefined
        this.raw = false
        this.isStatic = false
        this.isRootInsert = true
        this.isComment = false
        this.isCloned = false
        this.isOnce = false
      }
    
      // DEPRECATED: alias for componentInstance for backwards compat.
      /* istanbul ignore next */
      get child (): Component | void {
        return this.componentInstance
      }
    }
    

    每一个vnode都映射到一个真实的dom节点上。其中几个比较重要的属性:

    • tag 属性即这个vnode的标签属性
    • data 属性包含了最后渲染成真实dom节点后,节点上的class,attribute,style以及绑定的事件
    • children 属性是vnode的子节点
    • text 属性是文本属性
    • elm 属性为这个vnode对应的真实dom节点
    • key 属性是vnode的标记,在diff过程中可以提高diff的效率,后文有讲解

    比如,我定义了一个vnode,它的数据结构是:

        {
            tag: 'div'
            data: {
                id: 'app',
                class: 'page-box'
            },
            children: [
                {
                    tag: 'p',
                    text: 'this is demo'
                }
            ]
        }
    

    最后渲染出的实际的dom结构就是:

       <div id="app" class="page-box">
           <p>this is demo</p>
       </div>
    

    相关文章

      网友评论

          本文标题:用vnode实现一个DOM结构

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