详解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 相关文章推荐
JS类中定义原型方法的两种实现的区别
Mar 08 Javascript
Ext JS Grid在IE6 下宽度的问题解决方法
Feb 15 Javascript
动态的改变IFrame的高度实现IFrame自动伸展适应高度
Dec 28 Javascript
Javascript弹出窗口的各种方法总结
Nov 11 Javascript
Javascript selection的兼容性写法介绍
Dec 20 Javascript
Javascript设计模式之观察者模式(推荐)
Mar 29 Javascript
jQuery实现背景滑动菜单
Dec 02 Javascript
jQuery中用on绑定事件时需注意的事项
Mar 19 Javascript
利用Vue实现移动端图片轮播组件的方法实例
Aug 23 Javascript
vue 更改连接后台的api示例
Nov 11 Javascript
在vue中使用防抖和节流,防止重复点击或重复上拉加载实例
Nov 13 Javascript
如何用JavaScript检测当前浏览器是无头浏览器
Apr 27 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加速 eAccelerator配置和使用指南
2009/06/05 PHP
PHP 检查扩展库或函数是否可用的代码
2010/04/06 PHP
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
用php实现选择排序的解决方法
2013/05/04 PHP
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
2014/04/29 PHP
php实现PDO中捕获SQL语句错误的方法
2017/02/16 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
javascript 学习之旅 (3)
2009/02/05 Javascript
ExtJs中简单的登录界面制作方法
2010/08/19 Javascript
javascript学习笔记(十三) js闭包介绍(转)
2012/06/20 Javascript
jquery1.83 之前所有与异步列队相关的模块详细介绍
2012/11/13 Javascript
JSONP原理及简单实现
2016/06/08 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
解决html input验证只能输入数字,不能输入其他的问题
2017/07/21 Javascript
微信小程序 同步请求授权的详解
2017/08/04 Javascript
js实现数组和对象的深浅拷贝
2017/09/30 Javascript
JavaScript适配器模式详解
2017/10/19 Javascript
浅谈关于iview表单验证的问题
2018/09/29 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
ligerUI的ligerDialog关闭刷新的方法
2019/09/27 Javascript
JS对日期操作封装代码实例
2019/11/08 Javascript
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
Python数据类型详解(一)字符串
2016/05/08 Python
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
video结合canvas实现视频在线截图功能
2018/06/25 HTML / CSS
法国低价在线宠物商店:bitiba.fr
2020/07/03 全球购物
什么是Assembly(程序集)
2014/09/14 面试题
法学毕业生自荐信
2013/11/13 职场文书
浅谈python中的多态
2021/06/15 Python