深入学习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 相关文章推荐
IE与firefox之jquery用法区别
Oct 03 Javascript
JavaScript this 深入理解
Jul 30 Javascript
再谈javascript 动态添加样式规则 W3C校检
Dec 25 Javascript
自动刷新网页,自动刷新当前页面,JS调用
Jun 24 Javascript
理解js对象继承的N种模式
Jan 25 Javascript
JavaScript的函数式编程基础指南
Mar 19 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
Apr 30 Javascript
JS实现HTML表格排序功能
Aug 05 Javascript
JS设置CSS样式的方式汇总
Jan 21 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
Sep 23 Javascript
JavaScript实现计算多边形质心的方法示例
Jan 31 Javascript
js实现鼠标滑动到某个div禁止滚动
Sep 17 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中Date获取时间不正确怎么办
2008/06/05 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
Javascript数组的排序 sort()方法和reverse()方法
2012/06/04 Javascript
jQuery操作Select的Option上下移动及移除添加等等
2013/11/18 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
vuejs中监听窗口关闭和窗口刷新事件的方法
2018/09/21 Javascript
node.js学习笔记之koa框架和简单爬虫练习
2018/12/13 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
python实现黑客字幕雨效果
2018/06/21 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
2019/04/25 Python
解决django model修改添加字段报错的问题
2019/11/18 Python
Python 元组拆包示例(Tuple Unpacking)
2019/12/24 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
2019/12/25 Python
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
美体小铺加拿大官方网站:The Body Shop加拿大
2016/10/30 全球购物
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
香蕉共和国工厂店:Banana Republic Factory
2018/06/09 全球购物
美国在线旅行社:Crystal Travel
2018/09/11 全球购物
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
阿德的梦教学反思
2014/02/06 职场文书
幼儿园元旦活动感言
2014/03/02 职场文书
优秀经理获奖感言
2014/03/04 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
建党伟业观后感
2015/06/01 职场文书
关于Python使用turtle库画任意图的问题
2022/04/01 Python
在Python 中将类对象序列化为JSON
2022/04/06 Python