虚拟DOM

134 阅读2分钟

虚拟DOM

1.什么是虚拟DOM?以及虚拟DOM的作用?

  • 所谓虚拟DOM,就是用一个JS对象来描述一个DOM节点;

  • 当数据发生变化时,对比变化前后的虚拟DOM节点,通过DOM-Diff算法(这个算法先按下不表)计算出需要更新的地方,然后去更新需要更新的视图。这就是虚拟DOM产生的原因以及最大的用途。

2.Vnode类(也就是vue中实现虚拟dom的类)

VNode类可以描述出各种类型的真实DOM节点。

源码位置:src/core/vdom/vnode.js
export default class VNode {
  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类型,可以参考VNodeData类型中的数据信息*/
    this.children = children  /*当前节点的子节点,是一个数组*/
    this.text = text     /*当前节点的文本*/
    this.elm = elm       /*当前虚拟节点对应的真实dom节点*/
    this.ns = undefined            /*当前节点的名字空间*/
    this.context = context          /*当前组件节点对应的Vue实例*/
    this.fnContext = undefined       /*函数式组件对应的Vue实例*/
    this.fnOptions = undefined
    this.fnScopeId = undefined
    this.key = data && data.key           /*节点的key属性,被当作节点的标志,用以优化*/
    this.componentOptions = componentOptions   /*组件的option选项*/
    this.componentInstance = undefined       /*当前节点对应的组件的实例*/
    this.parent = undefined           /*当前节点的父节点*/
    this.raw = false         /*简而言之就是是否为原生HTML或只是普通文本,innerHTML的时候为true,textContent的时候为false*/
    this.isStatic = false         /*静态节点标志*/
    this.isRootInsert = true      /*是否作为跟节点插入*/
    this.isComment = false             /*是否为注释节点*/
    this.isCloned = false           /*是否为克隆节点*/
    this.isOnce = false                /*是否有v-once指令*/
    this.asyncFactory = asyncFactory
    this.asyncMeta = undefined
    this.isAsyncPlaceholder = false
  }

  get child (): Component | void {
    return this.componentInstance
  }
}

以上摘自 Vue源码系列-Vue中文社区

3.VNode的作用?

在视图渲染之前,把写好的template模板先编译成VNode并缓存下来,等到数据发生变化需要重新渲染时,把数据发生变化后生成的VNode与前一次缓存下来的VNode进行对比,最后根据有差异的VNode创建出真实的DOM节点插入到视图中,最终完成一次视图更新。

总结

为什么要有虚拟DOM呢,只更新有差异的视图,从而达到尽可能少的操作真实DOM的目的,以节省性能。其实说白了就是以JS的计算性能来换取操作真实DOM所消耗的性能。

以上都是在大佬的带领下的一些理解,希望可以帮到有需要的同学