关于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 相关文章推荐
js变量以及其作用域详解
Jul 18 Javascript
IFrame跨域高度自适应实现代码
Aug 16 Javascript
raphael.js绘制中国地图 地图绘制方法
Feb 12 Javascript
不到30行JS代码实现Excel表格的方法
Nov 15 Javascript
javascript事件委托的方式绑定详解
Jun 10 Javascript
基于jQuery实现复选框是否选中进行答题提示
Dec 10 Javascript
聊一聊jQuery插件uploadify使用方法
Aug 24 Javascript
详解浏览器渲染页面过程
Feb 09 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
Dec 09 Javascript
Vue触发式全局组件构建的方法
Nov 28 Javascript
详解为生产环境编译Angular2应用的方法
Dec 10 Javascript
javascript实现点击按钮切换轮播图功能
Sep 23 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入门学习知识点二 PHP简单的分页过程与原理
2011/07/14 PHP
一些php项目中比较通用的php自建函数的详解
2013/06/06 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
2014/02/18 PHP
PHP读MYSQL中文乱码的快速解决方法
2016/10/01 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
PHP实现微信提现功能
2018/09/30 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
Jquery异步提交表单代码分享
2015/03/26 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
使用 bootstrap modal遇到的问题小结
2016/11/09 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
Vue-cli配置打包文件本地使用的教程图解
2018/08/02 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
微信公众号平台接口开发 菜单管理的实现
2019/08/14 Javascript
layui数据表格跨行自动合并的例子
2019/09/02 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
vue项目打包为APP,静态资源正常显示,但API请求不到数据的操作
2020/09/12 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
django admin组件使用方法详解
2019/07/19 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
Pyecharts地图显示不完成问题解决方案
2020/05/11 Python
安装pyinstaller遇到的各种问题(小结)
2020/11/20 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
基于PyTorch中view的用法说明
2021/03/03 Python
澳大利亚第一旅行车和房车配件店:Caravan RV Camping
2020/12/26 全球购物
创先争优标语
2014/06/27 职场文书
致男子1500米运动员的广播稿
2019/11/08 职场文书
golang 如何用反射reflect操作结构体
2021/04/28 Golang
如何理解PHP核心特性命名空间
2021/05/28 PHP
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python