详解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学习笔记5 类和对象
Jan 11 Javascript
jquery ui bootstrap 实现自定义风格
Nov 14 Javascript
在Ubuntu系统上安装Node.JS的教程
Oct 15 Javascript
JS ES6多行字符串与连接字符串的表示方法
Apr 26 Javascript
vue2.0全局组件之pdf详解
Jun 26 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
May 31 jQuery
微信小程序按钮去除边框线分享页面功能
Aug 27 Javascript
微信小程序使用npm支持踩坑
Nov 07 Javascript
vue实现文字加密功能
Sep 27 Javascript
JS三级联动代码格式实例详解
Dec 30 Javascript
Flexible.js可伸缩布局实现方法详解
Nov 13 Javascript
解决vue $http的get和post请求跨域问题
Jun 07 Vue.js
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 文件上传功能实现代码
2009/06/24 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
JS 学习笔记 防止发生命名冲突
2009/07/30 Javascript
拥抱模块化的JavaScript
2012/03/07 Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
JavaScript学习笔记之Function对象
2015/01/22 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
在JavaScript中处理字符串之fontcolor()方法的使用
2015/06/08 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
利用jquery获取select下拉框的值
2016/11/23 Javascript
js获取当前周、上一周、下一周日期
2017/03/19 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
BootStrap selectpicker后台动态绑定数据的方法
2017/07/28 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
js实现的在本地预览图片功能示例
2019/11/09 Javascript
vue实现给div绑定keyup的enter事件
2020/07/31 Javascript
原生js滑动轮播封装
2020/07/31 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
数据挖掘之Apriori算法详解和Python实现代码分享
2014/11/07 Python
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
pycharm安装图文教程
2017/05/02 Python
利用Python读取文件的四种不同方法比对
2017/05/18 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
python列表使用实现名字管理系统
2019/01/30 Python
Python中如何使用if语句处理列表实例代码
2019/02/24 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
2020/10/30 Python
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
Expedia意大利旅游网站:酒店、机票和租车预订
2017/10/30 全球购物
教师现实表现材料
2014/02/14 职场文书
批评与自我批评材料
2014/02/15 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
商务邀请函
2015/01/30 职场文书