关于Vue.nextTick()的正确使用方法浅析


Posted in Javascript onAugust 25, 2017

本文主要给大家介绍了关于Vue.nextTick()的正确使用,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

什么是Vue.nextTick()

官方文档解释如下:

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

我理解的官方文档的这句话的侧重点在最后那半句获取更新后的DOM,获取更新后的DOM言外之意就是什么操作需要用到了更新后的DOM而不能使用之前的DOM或者使用更新前的DOM或出问题,所以就衍生出了这个获取更新后的DOM的Vue方法。所以放在Vue.nextTick()回调函数中的执行的应该是会对DOM进行操作的 js代码,比如Swiper扩展包的

var swiper = new Swiper('.swiper-container', {
   pagination: '.swiper-pagination',
   nextButton: '.swiper-button-next',
   prevButton: '.swiper-button-prev',
   paginationClickable: true,
   spaceBetween: 30,
   centeredSlides: true,
   autoplay: 2500,
   autoplayDisableOnInteraction: false
  });

什么时候需要用的Vue.nextTick()

  • 你在Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中。原因是什么呢,原因是在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进Vue.nextTick()的回调函数中。与之对应的就是mounted钩子函数,因为该钩子函数执行时所有的DOM挂载和渲染都已完成,此时在该钩子函数中进行任何DOM操作都不会有问题 。
  • 在数据变化后要执行的某个操作,而这个操作需要使用随数据改变而改变的DOM结构的时候,这个操作都应该放Vue.nextTick()的回调函数中。

原因是,Vue是异步执行dom更新的,一旦观察到数据变化,Vue就会开启一个队列,然后把在同一个事件循环 (event loop) 当中观察到数据变化的 watcher 推送进这个队列。如果这个watcher被触发多次,只会被推送到队列一次。这种缓冲行为可以有效的去掉重复数据造成的不必要的计算和DOm操作。而在下一个事件循环时,Vue会清空队列,并进行必要的DOM更新。

当你设置 vm.someData = 'new value',DOM 并不会马上更新,而是在异步队列被清除,也就是下一个事件循环开始时执行更新时才会进行必要的DOM更新。如果此时你想要根据更新的 DOM 状态去做某些事情,就会出现问题。。为了在数据变化之后等待 Vue 完成更新 DOM ,可以在数据变化之后立即使用 Vue.nextTick(callback) 。这样回调函数在 DOM 更新完成后就会调用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
5 cool javascript apps
Mar 24 Javascript
jQuery cdn使用介绍
May 08 Javascript
详解AngularJS 模态对话框
Apr 07 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
Aug 14 Javascript
js中this对象用法分析
Jan 05 Javascript
使用JavaScript中的lodash编写双色球效果
Jun 24 Javascript
jQuery判断自定义属性data-val用法示例
Jan 07 jQuery
MockJs结合json-server模拟后台数据
Aug 26 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
Sep 02 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
Sep 11 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
Nov 07 jQuery
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
Dec 21 Javascript
jQuery图片缩放插件smartZoom使用实例详解
Aug 25 #jQuery
JS中利用swiper实现3d翻转幻灯片实例代码
Aug 25 #Javascript
在Vue组件化中利用axios处理ajax请求的使用方法
Aug 25 #Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
Aug 25 #Javascript
JavaScript数据类型的存储方法详解
Aug 25 #Javascript
使用JQ完成表格隔行换色的简单实例
Aug 25 #Javascript
Vue.js实现网格列表布局转换方法
Aug 25 #Javascript
You might like
使用PHP和HTML5 FormData实现无刷新文件上传教程
2014/09/06 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
Laravel实现自定义错误输出内容的方法
2016/10/10 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
js 采用delete实现继承示例代码
2014/05/20 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
2015/01/07 Javascript
浅谈Vue.js
2017/03/02 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
element-ui 限制日期选择的方法(datepicker)
2018/05/16 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
python绘制条形图方法代码详解
2017/12/19 Python
Python多线程threading和multiprocessing模块实例解析
2018/01/29 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
python re模块匹配贪婪和非贪婪模式详解
2020/02/11 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
python海龟绘图之画国旗实例代码
2020/11/11 Python
Django多数据库联用实现方法解析
2020/11/12 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
2016/12/22 HTML / CSS
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
医学专业毕业生个人的求职信
2013/12/04 职场文书
人事经理岗位职责范本
2014/08/04 职场文书
民主生活会意见
2015/06/05 职场文书
公司考勤管理制度
2015/08/04 职场文书
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android