详解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面向对象设计一 工厂模式
Dec 20 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
Jan 24 Javascript
js中键盘事件实例简析
Jan 10 Javascript
jquery对象访问是什么及使用方法介绍
May 03 Javascript
JavaScript基础语法之js表达式
Jun 07 Javascript
BootStrop前端框架入门教程详解
Dec 25 Javascript
微信小程序 devtool隐藏的秘密
Jan 21 Javascript
如何正确理解javascript的模块化
Mar 02 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
Mar 07 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
Jun 30 Javascript
Angular中的ng-template及angular 使用ngTemplateOutlet 指令的方法
Aug 08 Javascript
在小程序Canvas中使用measureText的方法示例
Oct 19 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微信公众平台开发(四)回复功能开发
2016/12/06 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
firefox火狐浏览器与与ie兼容的2个问题总结
2010/07/20 Javascript
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
jQuery插件实现表格隔行换色且感应鼠标高亮行变色
2013/09/22 Javascript
使用focus方法让光标默认停留在INPUT框
2014/07/29 Javascript
javascript使用正则表达式检测IP地址
2014/12/03 Javascript
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
JavaScript学习笔记之ES6数组方法
2016/03/25 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
JS中的BOM应用
2018/02/02 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
Python求出0~100以内的所有素数
2018/01/23 Python
对pandas中apply函数的用法详解
2018/04/10 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
Centos下实现安装Python3.6和Python2共存
2018/08/15 Python
Python3中bytes类型转换为str类型
2018/09/27 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
python实现把两个二维array叠加成三维array示例
2019/11/29 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
html5实现滑块功能之type=&quot;range&quot;属性
2020/02/18 HTML / CSS
国际礼品店:GiftsnIdeas
2018/05/03 全球购物
工作说明书范文
2014/05/07 职场文书
小学模范班主任事迹材料
2014/05/13 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
长城导游词400字
2015/01/30 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
《原神》新角色演示“神里绫人:林隐泓洄” 宠妹狂魔
2022/04/03 其他游戏