模板转换成视图的过程

在底层实现中Vue会将模板编译成渲染函数,当然我们也可以不写模板,直接写渲染函数,以获得更好的控制。

渲染函数:渲染函数是用来生成Virtual DOM的;

VNode虚拟节点:vnode可以理解成dom节点的描述对象,它描述了应该怎样去创建真实的DOM节点;

patch(patching算法):虚拟DOM最核心的部分,它可以将vnode渲染成真实的DOM。这个过程是对比新旧虚拟节点之间有哪些不同,然后根据对比结果找出需要更新的的节点进行更新。其实际作用是在现有DOM上进行修改来实现更新视图的目的;

Virtual DOM

Virtual DOM用JS对象来描述dom的节点(VNode),这个对象至少包含标签名( tag)、属性(attrs)和子元素对象( children)这三个属性。它是对真实 DOM 的抽象,最终可以通过一系列操作把这个对象转化为真实的dom。

具体步骤为

Virtual DOM 本质上就是在 JS 和 DOM 之间做了一个缓存

Virtual DOM的作用

虚拟DOM的最终目标是将虚拟节点渲染到视图上,但是如果直接使用虚拟节点覆盖旧节点的话,会有很多不必要的DOM操作。例如,一个ul标签下很多个li标签,其中只有一个li有变化,这种情况下如果使用新的ul去替代旧的ul,因为这些不必要的DOM操作而造成了性能上的浪费。

为了避免不必要的DOM操作,虚拟DOM在虚拟节点映射到视图的过程中,将虚拟节点与上一次渲染视图所使用的旧虚拟节点(oldVnode)做对比,找出真正需要更新的节点来进行DOM操作,从而避免操作其他无需改动的DOM。

其实虚拟DOM在Vue.js主要做了两件事:

提供与真实DOM节点所对应的虚拟节点vnode;

将虚拟节点vnode和旧虚拟节点oldVnode进行对比,然后更新视图;

Virtual DOM的diff算法

递归地进行同级vnode的diff,最终实现整个DOM树的更新

步骤:

用 JavaScript 对象结构表示 DOM 树的结构;然后用这个树构建一个真正的 DOM 树,插到文档当中;

当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较,记录两棵树差异;

把所记录的差异应用到所构建的真正的DOM树上,视图就更新了;

Virtual DOM的优点

跨平台的优势:由于 Virtual DOM 是以 JavaScript 对象为基础而不依赖真实平台环境,所以使它具有了跨平台的能力,比如说浏览器平台、Weex、Node 等;

提高效率:操作 DOM 慢,js运行效率高,所以将DOM对比操作放在JS层可以提高效率;

提高渲染性能:通过patch 的核心----diff 算法,找出本次DOM需要更新的节点来更新,其他的不更新。比如修改某个model 100次,从1加到100,那么有了Virtual DOM的缓存之后,只会把最后一次修改patch到view上。

nextTick

this.$nextTick(()=>{//操作。。。

})

1 Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中;

2 当项目中你想在改变DOM元素的数据后基于新的dom做点什么,对新DOM一系列的js操作都需要放进Vue.nextTick()的回调函数中;

3 在使用某个第三方插件时 ,希望在vue生成的某些dom动态发生变化时重新应用该插件,也会用到该方法;

改变数据有时不更新

1 vue实现数据双向绑定有这么一个过程:当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用Object.defineProperty() 把这些属性全部转为getter/setter。每个组件实例都有相应的 watcher 实例对象,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的 setter 被调用时,会通知 watcher 重新计算,从而致使它关联的组件得以更新。实现数据data变化更新视图view。

var vm = newVue({

data:{

a:1; //vm.a 是响应的

}

})

vm.b= 2; //vm.b 是非响应的

2 没有更新dom是因为改变数据之后Object.defineproperty()的set方法没有被触发,即没有监测到数据更新。以下几种情况会出现这个问题:

当你利用索引直接设置数组的一项时,例如:this.items[indexOfItem] = newValue;

当你修改数组的长度时,例如:this.items.length = newLength;

数组的push,splice等方法也不会更新dom;

对象里边的修改:

data () {return{

student: {

name:''},

teach:["李磊"]

}

}//以下操作不会触发视图更新

this.student.name="XXX";

解决办法:

1 使用set:

this.$set('对象名', key, value); //对象写法

this.$set(this.teach,0, “韩梅梅”); //数组写法

2 使用deep

watch:{

student:{

handler:(n,o)=>{//逻辑处理

},

deep:true}

}

3  改变原对象或数组的地址

this.obj = Object.assign({},this.obj,{"sex","man"});

vue xunidom_vue的虚拟dom(Virtual DOM )相关推荐

  1. 虚拟dom (virtual dom)(vnode)

    1.什么是虚拟 DOM (vdom) 起源 虚拟dom最先是由facebook团队提出的,最先运用在react中,之后在vue2.0版本中引入了虚拟DOM的概念 是什么 虚拟 dom 是相对于浏览器所 ...

  2. Vue 源码学习—Virtual DOM(虚拟 DOM)

    Virtual DOM Virtual DOM是什么 真实DOM成员 引入原因 作用 Virtual DOM是什么 定义: 普通的js对象来描述DOM对象,不是真实的DOM,顾名思义,称为虚拟DOM ...

  3. vue的Virtual Dom实现- snabbdom解密

    vue在官方文档中提到与react的渲染性能对比中,因为其使用了snabbdom而有更优异的性能. JavaScript 开销直接与求算必要 DOM 操作的机制相关.尽管 Vue 和 React 都使 ...

  4. 【Virtual DOM】虚拟 DOM 和 Snabbdom 库

    前言 笔记来源:拉勾教育 大前端高薪训练营 阅读建议:建议通过左侧导航栏进行阅读 Virtual DOM 基本介绍 什么是 Virtual DOM Virtual DOM(虚拟 DOM),是由普通的的 ...

  5. vue源码分析系列三:render的执行过程和Virtual DOM的产生

    render 手写 render 函数,仔细观察下面这段代码,试想一下这里的 createElement 参数是什么 . new Vue({el: '#application',render(crea ...

  6. Virtual DOM 的实现原理

    Virtual DOM 的实现原理 Virtual DOM 的实现原理 什么是虚拟DOM 为什么要用虚拟DOM 虚拟 DOM 的作用和虚拟 DOM 库 虚拟 DOM 的作用 虚拟 DOM 库 Snab ...

  7. Virtual DOM和diff算法 概念理解

    (1)vdom是什么? vdom是虚拟DOM(Virtual DOM)的简称,指的是用JS模拟的DOM结构,将DOM变化的对比放在JS层来做.换而言之,vdom就是JS对象. 如下DOM结构: < ...

  8. Virtual DOM的简单实现

    了解React的同学都知道,React提供了一个高效的视图更新机制:Virtual DOM,因为DOM天生就慢,所以操作DOM的时候要小心翼翼,稍微改动就会触发重绘重排,大量消耗性能. 1.Virtu ...

  9. Vue进阶之Virtual DOM(虚拟DOM) 实现原理

    Vue进阶之Virtual DOM(虚拟DOM) 实现原理 Virtual DOM(虚拟 DOM),是由普通的 JS 对象来描述 DOM 对象,因为不是真实的 DOM 对象,所以叫 Virtual D ...

最新文章

  1. MVC应用程序播放RealPlayer(rmvb)视频
  2. zabbixdocker里的mysql_Zabbix Docker
  3. View的三大流程之View的测量
  4. C++中用函数模板实现和优化抽象操作
  5. SAS中修改一个表为编辑模式的时候不成功并给出警告的原因及解决办法
  6. java hashSet
  7. 观察者模式与发布/订阅模式的区别
  8. Android闹钟设置的解决方案
  9. Linux 学习笔记 二
  10. VMware Workstation下减小ubuntu系统占用系统盘大小
  11. 在WPF中开启摄像头扫描二维码(Media+Zxing)
  12. 纯正的国产工程项目管理软件分享
  13. 微信公众号网页授权-java开发
  14. android ui设计灵感,26款高品质 APP UI原型设计灵感
  15. 华为手机的10个使用技巧,你知道吗
  16. 中国无花果市场供需形势与未来产值预测报告(新版)2022-2027年
  17. 写在孤尽T31训练营开班第一天
  18. HackingLab的一套渗透测试题
  19. 疫情数据可视化01---中国疫情时间序列数据整理(截至7月30号)
  20. ThinkPHP 中实现 Rewrite 模式

热门文章

  1. 共享几套silverlight2 toolkit最新的皮肤控件样式下载
  2. 计算机没有程序,计算机小知识:想尝试写程序却没有电脑?这个在线编辑器满足你...
  3. android的帧布局,七、Android帧布局FrameLayout和霓虹灯效果
  4. linux程序设计知识点整理,笔试面试中C/C++重要知识点整理
  5. Error occurred while trying to proxy request
  6. python中感叹号_C#中感叹号(!) 的作用总结
  7. c程序语言设计练习题,C语言程序设计练习题(含程序及参考答案)
  8. 计算机系统基础:计算机性能评价知识笔记
  9. 前端:根据类型获取正则表达式字符串​
  10. Linux中防火墙命令笔记