美文网首页
vue源码分析(十七)核心函数之VNode

vue源码分析(十七)核心函数之VNode

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

    我们先打开文件src/core/vdom/vnode.js。代码如下:

    export default class VNode {
      tag: string | void;
      data: VNodeData | void;
      children: ?Array<VNode>;
      text: string | void;
      elm: Node | void;
      ns: string | void;
      context: Component | void; // rendered in this component's scope
      key: string | number | void;
      componentOptions: VNodeComponentOptions | void;
      componentInstance: Component | void; // component instance
      parent: VNode | void; // component placeholder node
    
      // strictly internal
      raw: boolean; // contains raw HTML? (server only)
      isStatic: boolean; // hoisted static node
      isRootInsert: boolean; // necessary for enter transition check
      isComment: boolean; // empty comment placeholder?
      isCloned: boolean; // is a cloned node?
      isOnce: boolean; // is a v-once node?
      asyncFactory: Function | void; // async component factory function
      asyncMeta: Object | void;
      isAsyncPlaceholder: boolean;
      ssrContext: Object | void;
      fnContext: Component | void; // real context vm for functional nodes
      fnOptions: ?ComponentOptions; // for SSR caching
      devtoolsMeta: ?Object; // used to store functional render context for devtools
      fnScopeId: ?string; // functional scope id support
    
      constructor (
        tag?: string,
        data?: VNodeData,
        children?: ?Array<VNode>,
        text?: string,
        elm?: Node,
        context?: Component,
        componentOptions?: VNodeComponentOptions,
        asyncFactory?: Function
      ) {
       this.tag = tag // 当前节点标签名
        this.data = data // 当前节点数据(VNodeData类型)
        this.children = children // 当前节点子节点
        this.text = text // 当前节点文本
        this.elm = elm // 当前节点对应的真实DOM节点
        this.ns = undefined // 当前节点命名空间
        this.context = context // 当前节点上下文
        this.fnContext = undefined // 函数化组件上下文
        this.fnOptions = undefined // 函数化组件配置项
        this.fnScopeId = undefined // 函数化组件ScopeId
        this.key = data && data.key // 子节点key属性
        this.componentOptions = componentOptions // 组件配置项 
        this.componentInstance = undefined // 组件实例
        this.parent = undefined // 当前节点父节点
        this.raw = false // 是否为原生HTML或只是普通文本
        this.isStatic = false // 静态节点标志
        this.isRootInsert = true // 是否作为根节点插入
        this.isComment = false // 是否为注释节点
        this.isCloned = false // 是否为克隆节点
        this.isOnce = false // 是否为v-once节点
        this.asyncFactory = asyncFactory // 异步工厂方法 
        this.asyncMeta = undefined // 异步Meta
        this.isAsyncPlaceholder = false // 是否为异步占位
      }
    }
    

    虚拟 dom 是相对于浏览器所渲染出来的真实 dom 的,在虚拟DOM技术出现之前,我们要改变页面展示的内容只能通过遍历查询 dom 树的方式找到需要修改的 dom 然后修改样式行为或者结构,来达到更新 ui 的目的。

    这种方式相当消耗计算资源,因为每次查询 dom 几乎都需要遍历整颗 dom 树,如果建立一个与 dom 树对应的虚拟 dom 对象( js 对象),以对象嵌套的方式来表示 dom 树,那么每次 dom 的更改就变成了 js 对象的属性的更改,这样一来就能查找 js 对象的属性变化要比查询 dom 树的性能开销小。

    相关文章

      网友评论

          本文标题:vue源码分析(十七)核心函数之VNode

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