详解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类代码
Jun 27 Javascript
javascript中删除指定数组中指定的元素的代码
Feb 12 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
Oct 17 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
Aug 02 Javascript
JavaScript兼容浏览器FF/IE技巧
Aug 14 Javascript
JavaScript轮播图简单制作方法
Feb 20 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
Sep 15 Javascript
用vue封装插件并发布到npm的方法步骤
Oct 18 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
Mar 02 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
Aug 17 Javascript
vue中get请求如何传递数组参数的方法示例
Nov 08 Javascript
javascript 对象 与 prototype 原型用法实例分析
Nov 11 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的FTP学习(二)[转自奥索]
2006/10/09 PHP
PHP中::、-&amp;gt;、self、$this几种操作符的区别介绍
2013/04/24 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
解析PHP中empty is_null和isset的测试
2013/06/29 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
推荐十款免费 WordPress 插件
2015/03/24 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
用php实现分页效果的示例代码
2020/12/10 PHP
Alliance vs Liquid BO3 第一场2.13
2021/03/10 DOTA
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
2015/09/05 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
[17:45]DOTA2 HEROES教学视频教你分分钟做大人-军团指挥官
2014/06/11 DOTA
[01:02:45]完美世界DOTA2联赛 LBZS vs Forest 第三场 11.07
2020/11/09 DOTA
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
python插入数据到列表的方法
2015/04/30 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
python实现逆序输出一个数字的示例讲解
2018/06/25 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
Django实现单用户登录的方法示例
2019/03/28 Python
简单了解python单例模式的几种写法
2019/07/01 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
2020/03/06 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
CSS3 实现的火焰动画
2020/12/07 HTML / CSS
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
《九寨沟》教学反思
2014/04/08 职场文书
大学生撤销处分思想汇报
2014/09/12 职场文书
社区四风存在问题及整改措施
2014/10/26 职场文书
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
2021/05/06 MySQL