vue xunidom_vue的虚拟dom(Virtual DOM )

模板转换成视图的过程

在底层实现中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"});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql之union合并查询

转载链接:http://www.cnblogs.com/zzwlovegfj/archive/2012/06/23/2559592.html union:联合的意思,即把两次或多次查询结果合并起来。 要求:两次查询的列数必须一致 推荐:列的类型可以不一样,但推荐查询的每一列&#…

Node.js 开发者 2020 年度报告

大家好,我是若川。欢迎加我微信 ruochuan12,长期交流学习。今天分享一篇Node.js报告,记得当时我还参与填写这个调查问卷了,Node.js的重要性不言而喻。微信预计阅读只需7分钟。点击下方卡片关注我,或者查看源码系列文章…

[SPS2010] 使用心得 7 - ebook for Installation

[SPS2010] 使用心得 7 - ebook for Installation 一本有关Sharepoint 2010安装的ebook (英语) http://sharepoint2007tips.com/Documents/Installing%20and%20Configuring%20SharePoint%202010.pdf 相当详细,目前为止仅有的可以下载的。 posted on 2010-…

视觉设计_视觉设计:

视觉设计What does the customer first see in your application? Yes, its your application design. So it is very important to pay attention to how the design is made. There’s so many factors to include, like how usually people meaning a symbol, how their pr…

开源分布式中间件 DBLE 快速入门指南

2019独角兽企业重金招聘Python工程师标准>>> 环境准备 DBLE项目资料 DBLE官方网站:https://opensource.actionsky.com 可以详细了解DBLE的背景和应用场景,本文不涉及到的细节都可在官方文档获得更细节都信息;对于刚了解到同学&…

文字输入限制_从拼音输入法的兴起看汉字文化圈的衰落

曾经韩国的报纸是这样的:现在的则是这样的:(上面两图均来自网络,如有侵权请告知)二战之后,曾经广泛使用汉字的朝韩跟越南都走上了废除汉字之路。日本虽然依然使用汉字,却也发布了《当用汉字表》…

JS弹出窗口

转载链接:http://www.jb51.net/article/32747.htm 如何利用网页弹出各种形式的窗口,我想大家大多都是知道些的,但那种多种多样的弹出式窗口是怎么搞出来的,我们今天就来学习一下: 1.弹启一个全屏窗口 windows.open(…

跟各位读者朋友分享下公众号运营策略

大家好,我是若川。欢迎加我微信 ruochuan12,加群交流学习。目前我的公众号运营策略,分享给各位读者朋友。点击下方卡片关注我,或者查看源码等系列文章。可能大多数关注的人不知道,我的公众号取名为若川视野的原因。「若…

[轉載]用PHP的ob_start();控制您的浏览器cache!

FROM http://www.phpchina.com/html/28/1628-3870.html Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况。输出控制函数不对使用 header() 或 setcookie(), 发送的…

oracle 带有变量的语句_【成都校区】Oracle SQL语句之常见优化方法总结

本帖出自于黑马程序员成都中心,更多资源可关注微信公众号1、SQL语句尽量用大写的;因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。2、使用表的别名: 当在SQL语句中连接多个表时, 尽量使用表的别名并把别名前缀于每…

js 获取上下文后面的路径_通过在数据后面显示上下文来可视化公众意见

js 获取上下文后面的路径In 1824, The Harrisburg Pennsylvanian, a newspaper from a town in Pennsylvania conducted the first known public opinion polls in history, and successfully predicted the result of the vote in the close race between Andrew Jackson and …

甘肃甘南步班邮递员:草原上的“递爱”艰途

图为甘肃甘南藏族自治州碌曲县郎木寺镇邮政支局的投递员进行投递工作。(资料图) 钟欣 摄 中新网兰州1月25日电 (吴玉蒿)渐近春节,刘权英投递邮件的工作愈加繁重。现年45岁的刘权英是甘肃甘南藏族自治州碌曲县郎木寺镇邮政支局的一名投递员。由…

核心编程6——线程

Note 0:了进程实际是由两个组件组成的:一个进程内核对象和一个地址空间.类似地,线程也由两个组件组成:一个是线程的内核对象,操作系统用它管理线程.内核对象还是系统用来存放线程统计信息的地方.一个线程堆栈,用于维护线程执行时所需的所有函数参数和局部变量.Note 1:进程是有惰…

PHP解决抢购、秒杀、抢楼、抽奖等阻塞式高并发库存防控超量的思路方法

转载链接:http://www.4u4v.net/thinking-approach-to-buy-spike-grab-floor-sweepstakes-and-other-high-concurrent-blocking-prevention-excess-inventory-solve-php.html 如今在电商行业里,秒杀抢购活动已经是商家常用促销手段。但是库存数量有限,而同…

看了就会的 Node.js 三大基础模块常用 API

大家好,我是若川。欢迎加我微信 ruochuan12,加群交流学习。今天分享一篇nodejs基础的文章。点击下方卡片关注我,或者查看源码等系列文章。在日常使用 Node 进行开发的时候,会使用到一些文件系统、路径操作等基础 API,这…

vue-cli3插件初体验

vue-cli3发布自2018年8月,距离现在还不是特别久,最好搭建项目刚好用到,所以写下这篇文章,记录一下踩坑经历。vue的作者说过,vue-cli的本质是模版的拉取,太多的配置导致了模版的难以维护,所以重构…

ios设计登录功能_亲爱的产品设计师,这是iOS 14的新功能

ios设计登录功能On June 22, 2020 Apple previewed iOS 14 for the first time. As always there are quite some changes you should know about as a product designer like widgets, pickers, app clips, permissions and more.2020年6月22日,Apple首次预览iOS 1…

c++ int 转 short_C/C++结构体内存对齐

在面试或工作中,经常会遇到内存对齐的问题。这里结合我的理解谈一谈对内存对齐的理解。1. 为什么要内存对齐,不对齐会怎么样?内存中存放数据是为了给CPU使用,CPU访问内存数据时会受到地址总线宽度的限制,也就是一次能从…

对于日访问量达到1W IP的处理方法

转自:http://www.java123.net/56026-2.html 对于日访问量达到1W IP的处理方法 一、1万ip真是不高: 1.常用数据用缓存,减轻数据库压力。 2.详细页数据生成静态页面。 二、10000算是相当小的了,不需要什么特殊的处理机制,只要符合最一般的…

数据契约(DataContract)

WCF第一要素就是契约: 服务契约用于声明可用于远程访问的类型。在Interface或class开始处使用服务契约标签. [ServiceContract] Public interface Iservice { } 接口调用契约的好处: 1. 同一服务类型可以实现多个不相干的服务契约. 2. 有利于版本升级 3. 按照…