深入理解Vue源码系列-6.认识下virtual dom

292 阅读1分钟

开始

这篇写一下virtual dom.

为什么会出现virtualDom

因为Dom上面有很多属性,方法,导致dom天生很慢,我们看看dom有什么,跑下面的代码,看代码

  var a = document.createElement('a');
    var str='';
    for(var k in a){
      str+=k+' '
    }
    console.log(str)

挂这么多东西,不慢才怪呢。

virtualDom是什么

对Dom的一种抽象

Vue中virtualDom的定义

看看vue中virtualDom的定义,就是上一节的 vnode

export default class VNode {
    //标签名
  tag: string | void;
    //数据
  data: VNodeData | void;
//子dom
  children: ?Array<VNode>;
  text: string | void;
//dom元素
  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
    this.children = children
    this.text = text
    this.elm = elm
    this.ns = undefined
    this.context = context
    this.fnContext = undefined
    this.fnOptions = undefined
    this.fnScopeId = 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
    this.asyncFactory = asyncFactory
    this.asyncMeta = undefined
    this.isAsyncPlaceholder = false
  }

  // DEPRECATED: alias for componentInstance for backwards compat.
  /* istanbul ignore next */
  get child (): Component | void {
    return this.componentInstance
  }
}

就是减了很多原来dom上用不太到的东西。简化了Dom,我们自己也可以写一个简易版的Virtual dom

let vNodes = v('div',{
    attr:{
        id:"abc"
    }
},'sdji')

上面这个大概就是 下面的dom,可以这样理解

<div id="abc" >sdji</div>

就是语法糖吧

总结

这里要了解为什么用虚拟dom和虚拟dom在vue中用vnode表示就可以了