详解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语法着色引擎(demo及打包文件下载)
Jun 13 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
Jan 06 Javascript
Javascript的闭包详解
Dec 26 Javascript
JS验证IP,子网掩码,网关和MAC的方法
Jul 02 Javascript
javascript中mouseover、mouseout使用详解
Jul 19 Javascript
js实现点击切换TAB标签实例
Aug 21 Javascript
json传值以及ajax接收详解
May 24 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
Dec 26 Javascript
每周一练 之 数据结构与算法(Stack)
Apr 16 Javascript
javascript创建元素和删除元素实例小结
Jun 19 Javascript
Angular value与ngValue区别详解
Nov 27 Javascript
详解JS预解析原理
Jun 16 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
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
2018/05/24 PHP
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
使用JS读秒使用示例
2013/09/21 Javascript
select多选 multiple的使用示例
2014/06/16 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
微信小程序 教程之数据绑定
2016/10/18 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
详解javascript void(0)
2020/07/13 Javascript
vue-cli3自动消除console.log()的调试信息方式
2020/10/21 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python读写unicode文件的方法
2015/07/10 Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
2018/02/13 Python
利用Pandas 创建空的DataFrame方法
2018/04/08 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
Python paramiko模块使用解析(实现ssh)
2019/08/30 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
欧洲第一的摇滚和金属乐队服装网站:EMP
2017/10/26 全球购物
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
私人委托书格式
2014/09/10 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
python常见的占位符总结及用法
2021/07/02 Python
MySql数据库触发器使用教程
2022/06/01 MySQL
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android