深入学习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 相关文章推荐
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
Mar 24 Javascript
基于jquery的文本框与autocomplete结合使用(asp.net+json)
May 30 Javascript
JavaScript合并两个数组并去除重复项的方法
Jun 13 Javascript
jQuery多文件异步上传带进度条实例代码
Aug 16 Javascript
微信小程序 生命周期详解
Oct 12 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
May 26 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
May 10 Javascript
JavaScript代码调试方法实例小结
Jan 05 Javascript
vue项目打包之后背景样式丢失的解决方案
Jan 17 Javascript
layui table 表格模板按钮的实例代码
Sep 21 Javascript
如何通过javaScript去除字符串两端的空白字符
Feb 06 Javascript
JavaScript 装逼指南(js另类写法)
May 10 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统计文章排行示例
2014/03/04 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
关于 byval 与 byref 的区别分析总结
2007/10/08 Javascript
JS在IE和FF下attachEvent,addEventListener学习笔记
2009/11/26 Javascript
javascript innerHTML使用分析
2010/12/03 Javascript
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
js 转义字符及URI编码详解
2017/02/28 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
2018/01/16 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
jQuery AJAX应用实例总结
2020/05/19 jQuery
初步认识Python中的列表与位运算符
2015/10/12 Python
利用Python读取文件的四种不同方法比对
2017/05/18 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
2018/02/24 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
解决Mac安装scrapy失败的问题
2018/06/13 Python
python django框架中使用FastDFS分布式文件系统的安装方法
2019/06/10 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
2019/06/19 Python
python滑块验证码的破解实现
2019/11/10 Python
Python3 集合set入门基础
2020/02/10 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
2020/03/09 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
使用CSS3的背景渐变Text Gradient 创建文字颜色渐变
2014/08/19 HTML / CSS
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
世界最大的私人旅行指南出版商:孤独星球
2016/08/23 全球购物
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
关于逃课的检讨书
2014/01/23 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
python实现黄金分割法的示例代码
2021/04/28 Python
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL
Python字典的基础操作
2021/11/01 Python