详解vue指令与$nextTick 操作DOM的不同之处


Posted in Javascript onAugust 02, 2018

异步更新队列

可能你还没有注意到,Vue 异步执行 DOM 更新。只要观察到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作上非常重要。然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。Vue 在内部尝试对异步队列使用原生的 Promise.then MessageChannel,如果执行环境不支持,会采用 setTimeout(fn, 0) 代替。

例如,当你设置 vm.someData = 'new value' ,该组件不会立即重新渲染。当刷新队列时,组件会在事件循环队列清空时的下一个“tick”更新。多数情况我们不需要关心这个过程,但是如果你想在 DOM 状态更新后做点什么,这就可能会有些棘手。虽然 Vue.js 通常鼓励开发人员沿着“数据驱动”的方式思考,避免直接接触 DOM,但是有时我们确实要这么做。为了在数据变化之后等待 Vue 完成更新 DOM ,可以在数据变化之后立即使用 Vue.nextTick(callback) 。这样回调函数在 DOM 更新完成后就会调用。例如:

<div id="example">{{message}}</div>
var vm = new Vue({
 el: '#example',
 data: {
 message: '123'
 }
})
vm.message = 'new message' // 更改数据
vm.$el.textContent === 'new message' // false
Vue.nextTick(function () {
 vm.$el.textContent === 'new message' // true
})

在组件内使用 vm.$nextTick() 实例方法特别方便,因为它不需要全局 Vue ,并且回调函数中的 this 将自动绑定到当前的 Vue 实例上:

Vue.component('example', {
 template: '<span>{{ message }}</span>',
 data: function () {
 return {
  message: '没有更新'
 }
 },
 methods: {
 updateMessage: function () {
  this.message = '更新完成'
  console.log(this.$el.textContent) // => '没有更新'
  this.$nextTick(function () {
  console.log(this.$el.textContent) // => '更新完成'
  })
 }
 }
})

vue指令

钩子函数

一个指令定义对象可以提供如下几个钩子函数 (均为可选):

bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。

inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。

update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。

componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。

unbind:只调用一次,指令与元素解绑时调用。

钩子函数的参数 (即 el、binding、vnode 和 oldVnode)。

需要注意的是:update时dom可能还没有插入文档,componentUpdated是DOM已经插入文档。并且所谓的“更新”这个钩子函数的触发条件非常宽泛,不容易把控。比如,其他与该节点无关的相邻节点更新,引发其布局的重流,也会导致该钩子函数触发

因此,如果想要在数据更新后,操作DOM,使用指令的update, componentUpdated 需要谨慎,可以考虑使用nextTick

总结

以上所述是小编给大家介绍的vue指令与$nextTick 操作DOM的不同之处,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
帮助避免错误的Javascript陷阱清单
May 31 Javascript
父页面显示遮罩层弹出半透明状态的dialog
Mar 04 Javascript
jQuery的cookie插件实现保存用户登陆信息
Apr 15 Javascript
js动态修改整个页面样式达到换肤效果
May 23 Javascript
jQuery设置和移除文本框默认值的方法
Mar 09 Javascript
移动端翻页插件dropload.js(支持Zepto和jQuery)
Jul 27 Javascript
Bootstrap源码解读网格系统(3)
Dec 22 Javascript
js中的触发事件对象event.srcElement与event.target详解
Mar 15 Javascript
Angular.js中控制器之间的传值详解
Apr 24 Javascript
详解Vuex中mapState的具体用法
Sep 28 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
Jan 23 Javascript
jquery分页插件pagination使用教程
Oct 23 jQuery
vue组件挂载到全局方法的示例代码
Aug 02 #Javascript
原生js封装的ajax方法示例
Aug 02 #Javascript
JS实现根据指定值删除数组中的元素操作示例
Aug 02 #Javascript
详解Angular中通过$location获取地址栏的参数
Aug 02 #Javascript
JavaScript防止全局变量污染的方法总结
Aug 02 #Javascript
微信小程序之自定义组件的实现代码(附源码)
Aug 02 #Javascript
Array数组对象中的forEach、map、filter及reduce详析
Aug 02 #Javascript
You might like
Discuz 6.0+ 批量注册用户名
2009/09/13 PHP
php常用Stream函数集介绍
2013/06/24 PHP
PHP生成压缩文件实例
2015/02/07 PHP
PHP Echo字符串的连接格式
2016/03/07 PHP
用JS控制回车事件的代码
2011/02/20 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
jQuery创建平滑的页面滚动(顶部或底部)
2013/02/26 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
javascript获取选中的文本的方法代码
2013/10/30 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
JS中Location使用详解
2015/05/12 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
原生Javascript插件开发实践
2017/01/09 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
ES6中Class类的静态方法实例小结
2017/10/28 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python selenium 三种等待方式解读
2016/09/15 Python
python函数式编程学习之yield表达式形式详解
2018/03/25 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
2020/05/23 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
乌克兰品牌化妆品和香水在线商店:Bomond
2020/01/14 全球购物
澳大利亚家具商店:Freedom
2020/12/17 全球购物
应届毕业生求职信
2014/05/26 职场文书
离婚协议书范本
2015/01/26 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
大国崛起观后感
2015/06/02 职场文书
Nginx的反向代理实例详解
2021/03/31 Servers
新手入门Mysql--概念
2021/06/18 MySQL
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB
Nginx如何配置多个服务域名解析共用80端口详解
2022/09/23 Servers