美文网首页
8.Virtual Dom

8.Virtual Dom

作者: NoNothing | 来源:发表于2020-05-29 11:11 被阅读0次

1.Vue.js 2.x 与 Vue.js 1.x 最大的区别就在于2.x使用了Virtual Dom(虚拟DOM)来更新DOM节点,提升渲染性能。
2.虽然前面我们的组件模板都是写在template选项里的,但是在Vue.js编译时,都会解析为Virtual Dom。
3.React 和 Vue2 都适用了Virtual Dom技术,Virtual Dom 并不是真正意义上的DOM,而是一个轻量级的JavaScript对象,在状态发生变化时,Virtual Dom 会进行Diff 运算,来更新只需要被替换的DOM,而不是全部重绘。与DOM操作相比,Virtual Dom 是基于JavaScript计算的,所以开销会小很多。Virtual Dom运行的过程:


image.png
//正常的DOM节点在HTML中是这样的:
<div id="main">
    <p>文本内容</p>    
    <p>文本内容</p>
</div>

// 用Virtual Dom 创建的JavaScript 对象一般会是这样的:
 var vNode = {
        tag:'div',
        attributes:{
            id:'main'
        },
        children:[
            // p 节点
        ]
    }

vNode对象通过一些特定的选项描述了真实的DOM结构。

4.在Vue.js 2中,Virtual Dom就是通过一种 VNode 类表达的,每个DOM元素或组件都对应一个VNode对象,在Vue.js 源码中是这样定义的:

export interface VNode{
    tag?: string;  //当前节点的标签名
    data?: VNodeData; // 当前节点的数据对象
    children?: VNode[]; //子节点,数组,也是VNode类型
    text?: Node; //当前节点的文本,一般文本节点或注释节点会有该属性
    elm?: Node;//当前虚拟节点对应的真实的DOM节点
    ns?: string;//节点的namespace
    context?: Vue;//编译作用域
    key?: string | number ;//节点的key属性,用于作为节点的标识,有利于patch的优化
    componentOptions?: VNodeComponentOptions;//创建组件实例时会用到的选项信息
    componentInstance?: Vue;
    parent?: VNode;//组件的占位节点
    raw?: boolean;//原始html
    isStatic?: boolean;//静态节点的标识
    isRootInsert: boolean;//是否作为根结点插入,被<transition>包裹的节点,该属性的值为false
    isComment: boolean;//当前节点是否是注释节点
}
// VNodeData代码:
export interface VNodeData{
    key?: string | number;
    slot?: string;
    scopedSlots?: {[key:string]:ScopedSlot};
    ref?: string;
    tag?: string ;
    staticClass?: string;
    class?: any;
    staticStyle?: {[key:string]:any};
    style?: Object[] | Object;
    props?: {[key:string]:any};
    attrs?: {[key:string]:any};
    domProps?: {[key:string]:any};
    hook?: {[key:string]:Function};
    on?:{[key:string]:Function | Function[]};
    nativeOn?:{[key:string]:Function | Function[]};
    transition?: Object;
    show?: boolean;
    inlineTemplate?: {
        render: Function;
        staticRenderFns:Function[];
    };
    directives?: VNodeDirective[];
    keepAlive?: boolean;
}

functionalContext //函数和组件的作用域
isCloned: boolean // 当前节点是否为克隆节点
isOnce: boolean // 当前节点是否有v-once指令

5.VNode 主要可以分为以下几类:

  • TextVNode 文本节点
  • ElementVNode 普通元素节点
  • ComponentVNode 组件节点
  • EmptyVNode 没有内容的注释节点
  • CloneVNode 克隆节点,可以是以上任意类型的节点,唯一的区别在于 isCloned 属性为true
image.png

相关文章

  • 8.Virtual Dom

    1.Vue.js 2.x 与 Vue.js 1.x 最大的区别就在于2.x使用了Virtual Dom(虚拟DOM...

  • dom 级别和dom 事件处理

    dom级别:dom0 dom1 dom2 dom3 dom事件处理:dom0 dom2 dom3 (1级DOM标准...

  • WY-DOM编程

    DOM Document Object Model DOM Core DOM HTML DOM Style DOM...

  • DOM事件

    DOM级别与DOM事件 DOM级别:DOM0级、DOM1级、DOM2级、DOM3级DOM事件:DOM0级事件处理、...

  • DOM事件

    DOM级别与DOM事件 DOM级别:DOM0级,DOM1级,DOM2级和DOM3级DOM事件:DOM0级事件处理,...

  • js红包雨活动

    function Block( dom ){ this.dom = dom; //dom this.parentW...

  • DOM操作的分类

    DOM操作分为三个方面,即DOM Core(核心)、HTML-DOM和CSS-DOM。 DOM Core DOM ...

  • 虚拟 DOM 和 diff 算法

    虚拟 DOM(Virtual DOM) 通过 JS 对象表示 DOM 结构,虚拟DOM 是对 DOM 的抽象 通常...

  • jQuery——DOM

    DOM操作分类 一般来说,DOM操作分为3个方面,即DOM Core、HTML-DOM、CSS-DOM。 DOM ...

  • JavaScript高级程序设计前四章

    1. DOM级别 1.1 DOM1级 由DOM核心(DOM Core)和DOM HTML两个模块组成。 DOM核心...

网友评论

      本文标题:8.Virtual Dom

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