深入学习Vue nextTick的用法及原理


Posted in Javascript onOctober 08, 2019

Vue.nextTick是Vue官方给我们提供的一个API(方法),作用是在下次DOM更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的DOM;

那么我们的理解是:当数据发生变化之后,DOM视图并不会立即更新,如果我们在发生变化之后立马去获取某个节点或者某个节点的值,很有可能结果就是undefined;因为Vue实现响应式并不是数据发生变化之后DOM立即变化,而是按一定的策略进行DOM的更新;

来看一个小demo:

App.vue 

<template>
 <div id="app">
    <div ref="message">{{msg}}</div>
    <div v-if="msg1">{{msg1}}</div>
    <button @click="changeMsg">Change the Message</button>
 </div>
</template>

<script>
export default {
 name: 'App',
 data(){
  return {
   msg:"Hello Vue",
   msg1: '',
  }
 },
 methods:{
  changeMsg(){
   this.msg='hello world';
   this.msg1=this.$refs.message.innerHTML;
    console.log("更新DOM之前:"+this.msg1)
  }
 }
}
</script>

<style>
#app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
</style>

深入学习Vue nextTick的用法及原理

我们通过运行代码能够看到当我们不在this.$nextTick方法里面进行DOM操作的时候,this.$refs.message.innerHTML的值存储的还是之前的初始值;

修改代码:

App.vue

<template>
 <div id="app">
    <div ref="message">{{msg}}</div>
    <div v-if="msg1">{{msg1}}</div>
    <button @click="changeMsg">Change the Message</button>
 </div>
</template>

<script>
export default {
 name: 'App', 
 data(){
  return {
   msg:"Hello Vue",
   msg1: '',
  }
 },
 methods:{
  changeMsg(){
   this.msg='hello world';
   // this.msg1=this.$refs.message.innerHTML;
   // console.log("更新DOM之前:"+this.msg1)
    this.$nextTick(()=>{
     this.msg1=this.$refs.message.innerHTML;
     console.log("更新DOM之后:"+this.msg1)
    })
  }
 }
}
</script>

<style>
#app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
</style>

深入学习Vue nextTick的用法及原理

修改代码之后我们可以发现,使用this.$nextTick很容易的就接收到了更新后的值,正如官网解释:在下次DOM更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的DOM;

再来修改代码对比一下:

App.vue

<template>
 <div id="app">
    <div ref="message">{{msg}}</div>
    <div v-if="msg1">{{msg1}}</div>
    <button @click="changeMsg">Change the Message</button>
 </div>
</template>

<script>
export default {
 name: 'App', 
 data(){
  return {
   msg:"Hello Vue",
   msg1: '',
  }
 },
 methods:{
  changeMsg(){
   this.msg='hello world';
   this.msg1=this.$refs.message.innerHTML;
    console.log("更新DOM之前:"+this.msg1)
    this.$nextTick(()=>{
     this.msg1=this.$refs.message.innerHTML;
     console.log("更新DOM之后:"+this.msg1)
    })
  }
 }
}
</script>

<style>
#app {
 font-family: 'Avenir', Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
</style>

深入学习Vue nextTick的用法及原理

经过修改代码,我们现在可以很容易看出来this.$nextTick(callback)的作用,callback是回调函数也就是我们要进行操作DOM的事情;

应用场景:

在vue的生命周期钩子函数created()中进行DOM操作的时候一定要把DOM操作放入到this.$nextTick()中;

因为在created钩子函数触发的时候,DOM是没有进行渲染的;DOM没有进行渲染,然后进行DOM操作无疑是徒劳的;

所以我们在created中进行DOM操作的时候,一定要将DOM操作放入到this.$nextTick()中;

与之相反的是mounted,因为当触发mounted的时候,DOM的挂载和渲染都已经完成了,所以在mounted中进行DOM操作是不会有任何问题的;

因为DOM更新是异步的,像v-if指令判断增删DOM元素,我们在方法中给变量赋值的时候,如果不使用this.$nextTick(),我们很有可能拿到的还是初始值,如果想拿到更新后的值,需要使用this.$nextTick()方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
动态调用css文件——jquery的应用
Feb 20 Javascript
Jquery中对数组的操作代码
Aug 12 Javascript
ToolTips JQEURY插件之简洁小提示框效果
Nov 19 Javascript
javascript工具库代码
Mar 29 Javascript
jQuery响应鼠标事件并隐藏与显示input默认值
Aug 24 Javascript
JavaScript中string对象
Jun 12 Javascript
基于jquery实现全屏滚动效果
Nov 26 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
May 31 Javascript
JS实现图片的不间断连续滚动的简单实例
Jun 03 Javascript
jQuery实现checkbox列表的全选、反选功能
Nov 24 Javascript
js合并两个数组生成合并后的key:value数组
May 09 Javascript
微信小程序实现文字无限轮播效果
Dec 28 Javascript
jQuery 筛选器简单操作示例
Oct 02 #jQuery
jQuery 查找元素操作实例小结
Oct 02 #jQuery
JavaScript 作用域实例分析
Oct 02 #Javascript
JavaScript Dom 绑定事件操作实例详解
Oct 02 #Javascript
JavaScript 面向对象基础简单示例
Oct 02 #Javascript
Nautil 中使用双向数据绑定的实现
Oct 02 #Javascript
详解element-ui级联菜单(城市三级联动菜单)和回显问题
Oct 02 #Javascript
You might like
php字符串截取问题
2006/11/28 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
ThinkPHP的URL重写问题
2014/06/22 PHP
PHP curl 抓取AJAX异步内容示例
2014/09/09 PHP
php自定义apk安装包实例
2014/10/20 PHP
php-redis中的sort排序函数总结
2015/07/08 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
phpStorm2020 注册码
2020/09/17 PHP
javascript 年月日联动实现核心代码
2009/12/21 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
2013/08/29 Javascript
jquery中animate动画积累的解决方法
2013/10/05 Javascript
jQuery中prepend()方法用法实例
2014/12/25 Javascript
Bootstarp风格的toggle效果分享
2016/02/23 Javascript
jQuery xml字符串的解析、读取及查找方法
2016/03/01 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
React简单介绍
2017/05/24 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
python和shell实现的校验IP地址合法性脚本分享
2014/10/23 Python
Python实现模拟时钟代码推荐
2015/11/08 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
Python实现连接postgresql数据库的方法分析
2017/12/27 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
python使用magic模块进行文件类型识别方法
2018/12/08 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
合作协议书怎么写
2014/04/18 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
演讲开场白和结束语
2015/05/29 职场文书
pandas数值排序的实现实例
2021/07/25 Python
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫
java开发双人五子棋游戏
2022/05/06 Java/Android