详解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 汉字字节判断
Aug 01 Javascript
js setattribute批量设置css样式
Nov 26 Javascript
AngularJS打开页面隐藏显示表达式用法示例
Dec 25 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
Feb 21 Javascript
JavaScript基本类型值-Number类型
Feb 24 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
Mar 14 Javascript
微信小程序 动态绑定数据及动态事件处理
Mar 14 Javascript
jQuery 利用ztree实现树形表格的实例代码
Sep 27 jQuery
vue+element实现表单校验功能
May 20 Javascript
基于Node.js的大文件分片上传示例
Jun 19 Javascript
vue中用 async/await 来处理异步操作
Jul 18 Javascript
js实现简单的轮播图效果
Dec 13 Javascript
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
PHP 金额数字转换成英文
2010/05/06 PHP
PHP用GD库生成高质量的缩略图片
2011/03/09 PHP
php版微信返回用户text输入的方法
2016/11/14 PHP
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
select标记美化--JS式插件、后期加载
2013/04/01 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
百度地图自定义控件分享
2015/03/04 Javascript
深入浅析JavaScript中prototype和proto的关系
2015/11/15 Javascript
微信小程序进行微信支付的步骤昂述
2016/12/01 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
微信小程序radio组件使用详解
2018/01/31 Javascript
Vue组件库发布到npm详解
2018/02/17 Javascript
vue+webpack模拟后台数据的示例代码
2018/07/26 Javascript
微信小程序实现时间预约功能
2018/11/27 Javascript
简单学习5种处理Vue.js异常的方法
2019/06/17 Javascript
详解JavaScript修改注册表的方法
2020/01/05 Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
2020/04/07 Javascript
javascript实现时钟动画
2020/12/03 Javascript
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
Python爬取国外天气预报网站的方法
2015/07/10 Python
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
Python实现mysql数据库更新表数据接口的功能
2017/11/19 Python
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
师德师风学习材料
2014/12/19 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书
运动会报道稿大全
2015/07/23 职场文书
MySQL开启事务的方式
2021/06/26 MySQL
如何打开Win11系统注册表编辑器?Win11注册表编辑器打开修复方法
2022/04/05 数码科技