详解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对JSON进行模式匹配 (Part 2 - 实现)
Jul 17 Javascript
基于jquery的页面划词搜索JS
Sep 14 Javascript
jQuery删除节点的三个方法即remove()detach()和empty()
Dec 27 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
Mar 19 Javascript
javascript使用闭包模拟对象的私有属性和方法
Oct 05 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
Nov 26 Javascript
vue动态组件实现选项卡切换效果
Mar 08 Javascript
vue的安装及element组件的安装方法
Mar 09 Javascript
Node 升级到最新稳定版的方法分享
May 17 Javascript
快速解决vue-cli在ie9+中无效的问题
Sep 04 Javascript
JS原生带缩略图的图片切换效果
Oct 10 Javascript
JavaScript字符串转数字的简单实现方法
Nov 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
ThinkPHP无限级分类原理实现留言与回复功能实例
2014/10/31 PHP
CodeIgniter配置之database.php用法实例分析
2016/01/20 PHP
JS模拟多线程
2007/02/07 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
2013/12/23 Javascript
浅谈javascript的调试
2015/01/28 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
浅析BootStrap栅格系统
2016/06/07 Javascript
JavaScript实现Java中Map容器的方法
2016/10/09 Javascript
Json按某个键的值进行排序
2016/12/22 Javascript
微信小程序 WebSocket详解及应用
2017/01/21 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
微信小程序scroll-view实现滚动穿透和阻止滚动的方法
2018/08/20 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
2020/01/22 Javascript
[39:00]Optic vs VP 2018国际邀请赛淘汰赛BO3 第三场 8.24
2018/08/25 DOTA
python发送HTTP请求的方法小结
2015/07/08 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
python中协程实现TCP连接的实例分析
2018/10/14 Python
python GUI实现小球满屏乱跑效果
2019/05/09 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
悦木之源美国官网:Origins美国
2016/08/01 全球购物
公益广告宣传方案
2014/02/28 职场文书
会计工作决心书
2014/03/11 职场文书
给全校老师的建议书
2014/03/13 职场文书
双方协议书
2014/04/22 职场文书
道德之星事迹材料
2014/05/03 职场文书
大学生创业计划书怎么写
2014/09/15 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
人民调解协议书
2016/03/21 职场文书