深入学习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 相关文章推荐
javascript的事件描述
Sep 08 Javascript
使用jQuery的attr方法来修改onclick值
Jul 07 Javascript
浅析JavaScript访问对象属性和方法及区别
Nov 16 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
Jun 01 Javascript
JavaScript必知必会(五) eval 的使用
Jun 08 Javascript
Express使用html模板的详细代码
Sep 18 Javascript
vue.js语法及常用指令
Oct 29 Javascript
快速解决brew安装特定版本flow的问题
May 17 Javascript
详解Vue中watch对象内属性的方法
Feb 01 Javascript
js实现图片推拉门效果代码实例
May 18 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
Feb 11 Javascript
教你部署vue项目到docker
Apr 05 Vue.js
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
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
php中将时间差转换为字符串提示的实现代码
2011/08/08 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
PHP7如何开启Opcode打造强悍性能详解
2018/05/11 PHP
Dom 结点创建 基础知识
2011/10/01 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
利用jQuary实现文字浮动提示效果示例代码
2013/12/26 Javascript
Javascript字符串浏览器兼容问题分析
2014/12/01 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
Javascript的动态增加类的实现方法
2016/10/20 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
vue组件父子间通信详解(三)
2017/11/07 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
js实现双色球效果
2020/08/02 Javascript
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
paramiko模块安装和使用(远程登录服务器)
2014/01/27 Python
Python网站验证码识别
2016/01/25 Python
浅谈python日志的配置文件路径问题
2018/04/28 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
印度尼西亚综合购物网站:Lazada印尼
2016/09/07 全球购物
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
璀璨的珍珠、密钉和个性化珠宝:Lily & Roo
2021/01/21 全球购物
写好求职信第一句话的技巧
2013/10/26 职场文书
2014年小学植树节活动方案
2014/03/02 职场文书
副处级干部考察材料
2014/05/17 职场文书
社区活动总结范文
2015/05/07 职场文书
幼儿园小班开学寄语
2015/05/27 职场文书
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android