VueJS的虚拟DOM是基于开源Snabbdom的。

前端发展很多年,直到出现了虚拟DOM,才可以从操作DOM解脱出来。

JQuery的出现,简化了操作DOM的过程,但是还是摆脱不了操作DOM。

而虚拟DOM的目的是,使用虚拟节点代替真实节点,所有操作都发生在虚拟节点,然后通过diff算法对比新旧两棵虚拟DOM,计算出更新真实DOM的最少操作,由框架代替用户执行这些操作,所以用户可以把大量的精力放在业务逻辑上。

VNode

在Vue里,使用VNode表示一个虚拟节点,在Vue里,VNode分两种类别:

  • 普通VNode
  • 组件VNode

它们的区别是普通VNode有children属性,而组件VNode的children属性为undefined。VNode 的结构如下:

// 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 scopekey: string | number | void;componentOptions: VNodeComponentOptions | void;componentInstance: Component | void; // component instanceparent: VNode | void; // component placeholder node// strictly internalraw: boolean; // contains raw HTML? (server only)isStatic: boolean; // hoisted static nodeisRootInsert: boolean; // necessary for enter transition checkisComment: boolean; // empty comment placeholder?isCloned: boolean; // is a cloned node?isOnce: boolean; // is a v-once node?asyncFactory: Function | void; // async component factory functionasyncMeta: Object | void;isAsyncPlaceholder: boolean;ssrContext: Object | void;fnContext: Component | void; // real context vm for functional nodesfnOptions: ?ComponentOptions; // for SSR cachingfnScopeId: ?string; // functioanl scope id supportconstructor (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 // 函数化组件ScopeIdthis.key = data && data.key // 子节点key属性this.componentOptions = componentOptions // 组件配置项 this.componentInstance = undefined // 组件实例this.parent = undefined // 当前节点父节点this.raw = false // 是否为原生HTML或只是普通文本this.isStatic = false // 静态节点标志 keep-alivethis.isRootInsert = true // 是否作为根节点插入this.isComment = false // 是否为注释节点this.isCloned = false // 是否为克隆节点this.isOnce = false // 是否为v-once节点this.asyncFactory = asyncFactory // 异步工厂方法 this.asyncMeta = undefined // 异步Metathis.isAsyncPlaceholder = false // 是否为异步占位}// 容器实例向后兼容的别名get child (): Component | void {return this.componentInstance}
}

在看VNode的时候小结以下几点:

  • 所有对象的 context 选项都指向了 Vue 实例;
  • elm 属性则指向了其相对应的真实 DOM 节点;
  • DOM 中的文本内容被当做了一个只有 text 没有 tag 的节点;
  • classid 等HTML属性都放在了 data 中。

vue中的VNode相关推荐

  1. c++ gdb 绑定源码_【Vue原理】VNode 源码版

    ↑点击上方 "神仙朱" 一起研究Vue源码吧 专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧 研究基于 Vue版 ...

  2. Vue中插入HTML代码的方法

    我们需要吧<p>Hello World</p>插入到<p>My name is Pjee</p>应该如何做? 一.使用v-html v-html:更新元 ...

  3. vue中slot(插槽)详解,slot、slot-scope和v-slot

    slot是什么 slot,也称插槽,可以类比为插卡式的FC游戏机,游戏机(子组件)暴露卡槽(插槽)让用户插入不同的游戏磁条(自定义内容),游戏机会读取并加载磁条里的游戏 Vue的slot,是组件的一块 ...

  4. JS每日一题:Vue中的diff算法?

    20190125 Vue中的diff算法? 概念: diff算法是一种优化手段,将前后两个模块进行差异对比,修补(更新)差异的过程叫做patch(打补丁) 为什么vue,react这些框架中都会有di ...

  5. Vue 中的compile操作方式

    这篇文章主要介绍了Vue 中的compile操作方法,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. 在 Vue 里,模板编译也是非常重要的一部分 ...

  6. 笔记三 vue中封装复用 过滤器 自定义组件 vue中component选项

    题外话: npm install -g express-generator npm安装express框架 封装复用 Vue中关于封装复用的内容,属于Vue中的进阶知识,在实战中对开发者的抽象和泛化能力 ...

  7. jsx怎么往js里传参数_在vue中使用jsx语法的使用方法

    什么是JSX? JSX就是Javascript和XML结合的一种格式.React发明了JSX,利用HTML语法来创建虚拟DOM.当遇到 我为什么要在vue中用JSX? 想折腾一下呗,开玩笑.最开始是因 ...

  8. vue中 点击事件的写法_vue中的事件:原生事件与自定义事件__Vue.js

    模板编译 processAttrs 对于ast attributes处理(v-on/@) 利用onRE与dirRE来捕获事件 这里最重要的就是dynamic的判断,vue中可以用动态参数来命名事件名称 ...

  9. JS每日一题:vue中keepalive怎么理解?

    20190212问 vue中keepalive怎么理解? 说在前面: keep-alive是vue源码中实现的一个组件, 感兴趣的可以研究源码 https://github.com/vuejs/vue ...

最新文章

  1. ORA-29275:部分多字节字符
  2. php设计模式 -- 工厂模式
  3. redis(12)--事件,客户端,服务器
  4. 第19课:知识挖掘与知识图谱概述
  5. ctype.h,ctype.c 结构分析 \linux-1.0\linux\include\linux\ctype
  6. linux 进程 读写锁,linux 下实现高性能读写锁(read/write lock)
  7. 配置Windows Server 2008群集
  8. JQuery时间轴timeline插件的学习-Lateral On-Scroll Sliding with jQuery+technotarek / timeliner
  9. 二维数组越界_中国电子学会青少年软件编程等级考试2级(C/C++)专题二:一维数组...
  10. Android NDK 建立cocos2dx项目
  11. 小米+线刷+android,小米10 Android 11 Beta1刷机包发布,线刷体验,国内首批
  12. 第四范式战疫侦察三部曲:追踪、筛查、推演 提升疫情防控能力
  13. android 投屏 电脑,安卓王者荣耀投屏电脑
  14. 【系统相关】远程连接,凭据不工作
  15. python3 get爬取网页标题、链接和链接的数字ID
  16. css 平移到某个位置_平移:translate() - CSS3 | 绿叶学习网
  17. 期末大作业之Matlab美图秀秀【GUI界面】
  18. 凭什么都是Java开发三年,而他能进大厂薪资是“我”2倍?
  19. chrom浏览器代理插件使用教程
  20. 2022.04.29(LC_680_验证回文字符串 Ⅱ)

热门文章

  1. 小学计算机教案 插入艺术字,五年级信息技术《艺术字标题》教学设计
  2. 数据结构与算法之KMP算法中Next数组代码原理分析
  3. Ubuntu如何定时清理内存
  4. 指针使用前应先初始化
  5. Linux下SVN搭建与配置
  6. 全面剖析Ajax的XMLHttpRequest对象(学习Ajax必须知道的东西)
  7. 昨天的性能优化与今天的网站故障
  8. Spring中获取泛型类型
  9. python播放音乐-python 模拟(简易)音乐播放器
  10. S5PV210体系结构与接口07:中断系统编程