详解vue中$nextTick和$forceUpdate的用法


Posted in Javascript onDecember 11, 2019

1、$nextTick

vm.$nextTick( [callback] )

this.$nextTick()将回调延迟到下次 DOM 更新循环之后执行,在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上。

应用场景:

1、 在Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中。
2、 因为在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将

DOM操作的js代码放进Vue.nextTick()的回调函数中。与之对应的就是mounted()钩子函数,因为该钩子函数执行时所有的DOM挂载和渲染都已完成,此时在该钩子函数中进行任何DOM操作都不会有问题 。

在数据变化后要执行的某个操作,而这个操作需要使用随数据改变而改变的DOM结构的时候,这个操作都应该放进Vue.nextTick()的回调函数中。

<html>
  <head>
      <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  </head>
  <body>
    <div id="app">
      <section>
        <div ref="hello">
         <h1>Hello World ~</h1>
        </div>
        <button type="danger" @click="get">点击</button>
       </section>
     </div>
  </body>
</html>
<script>
new Vue({
 el: '#app',
 methods: {
   get() {
    console.log(0);
   }
  },
  mounted() {
   console.log(333);
   console.log(this.$refs['hello']);
   this.$nextTick(() => {
    console.log(444);
    console.log(this.$refs['hello']);
   });
  },
  created() {
   console.log(111);
   console.log(this.$refs['hello']);
   this.$nextTick(() => {
    console.log(222);
    console.log(this.$refs['hello']);
   });
  }
})
</script>

详解vue中$nextTick和$forceUpdate的用法

可以根据打印的顺序看到,在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作并无作用,而在created()里使用this.$nextTick()可以等待dom生成以后再来获取dom对象。

<html>
  <head>
      <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
  </head>
  <body>
    <div id="app">
      <section>
        <h1 ref="hello">{{ value }}</h1>
        <button type="danger" @click="get">点击</button>
       </section>
     </div>
  </body>
</html>
<script>
new Vue({
 el: '#app',
 data() {
   return {
    value: 'Hello World ~'
   };
  },
  methods: {
   get() {
    this.value = '你好啊';
    console.log(this.$refs['hello'].innerText);
    this.$nextTick(() => {
     console.log(this.$refs['hello'].innerText);
    });
   }
  },
  mounted() {
  },
  created() {
  }
})
</script>

详解vue中$nextTick和$forceUpdate的用法

this.$nextTick()在页面交互,尤其是从后台获取数据后重新生成dom对象之后的操作有很大的优势。

2、this.$forceUpdate()

迫使Vue实例重新(rander)渲染虚拟DOM,注意并不是重新加载组件。结合vue的生命周期,调用$forceUpdate后只会触发beforeUpdate和updated这两个钩子函数,不会触发其他的钩子函数。它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件;

应用场景: 当在data里没有显示的声明一个对象的属性,而是之后给该对象添加属性,这种情况vue是检测不到数据变化的,可以使用$forceUpdate()

html:
<span class="test">{{egData.value}}</span>
<el-button @click="changeData">改变</el-button>
 -------------------------------
js:
data(){
 return {
 egData: {}
}
 }
-------------------------------
 
 methods:{
changeData () {
  this.egData.value = 'oldValue'
  this.$forceUpdate() // dom会更新
}
}

但是这种做法并不推荐,官方说如果你现在的场景需要用forceUpdate方法 ,那么99%是你的操作有问题,如上data里不显示声明对象的属性,之后添加属性时正确的做法时用 vm.$set() 方法,所以forceUpdate请慎用。

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

Javascript 相关文章推荐
js带按钮的提示框可供选择示例代码
Sep 17 Javascript
利用js实现禁止复制文本信息
Jun 03 Javascript
javascript中Date()函数在各浏览器中的显示效果
Jun 18 Javascript
jquery ajax分页插件的简单实现
Jan 27 Javascript
基于javascript实现句子翻牌网页版小游戏
Mar 23 Javascript
微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决
Dec 14 Javascript
JS中type=&quot;button&quot;和type=&quot;submit&quot;的区别
Jul 04 Javascript
laydate 显示结束时间不小于开始时间的实例
Aug 11 Javascript
原生JS 购物车及购物页面的cookie使用方法
Aug 21 Javascript
vue中SPA单页面应用程序详解
Nov 07 Javascript
Javascript Symbol原理及使用方法解析
Oct 22 Javascript
js实现自动锁屏功能
Jun 02 Javascript
基于jQuery实现可编辑的表格
Dec 11 #jQuery
jQuery实现可编辑的表格
Dec 11 #jQuery
vue element自定义表单验证请求后端接口验证
Dec 11 #Javascript
详解如何在JS代码中消灭for循环
Dec 11 #Javascript
Angular封装表单控件及思想总结
Dec 11 #Javascript
小程序接口的promise化的实现方法
Dec 11 #Javascript
js中Function引用类型常见有用的方法和属性详解
Dec 11 #Javascript
You might like
php获取域名的google收录示例
2014/03/24 PHP
windows下apache搭建php开发环境
2015/08/27 PHP
PHP 中常量的知识整理
2017/04/14 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
javascript编程起步(第四课)
2007/02/27 Javascript
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
利用node.js本地搭建HTTP服务器
2017/04/19 Javascript
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
对angularjs框架下controller间的传值方法详解
2018/10/08 Javascript
微信小程序tabBar设置实例解析
2019/11/14 Javascript
基于JavaScript的数据结构队列动画实现示例解析
2020/08/06 Javascript
[01:09:20]NB vs NAVI Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[38:38]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.17
2020/12/18 DOTA
Python实现的下载8000首儿歌的代码分享
2014/11/21 Python
Python 备份程序代码实现
2017/03/06 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
2018/07/11 Python
python线程的几种创建方式详解
2019/08/29 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
Django ValuesQuerySet转json方式
2020/03/16 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
2020/06/10 Python
anaconda3安装及jupyter环境配置全教程
2020/08/24 Python
前端隐藏出边界内容的实现方法
2016/04/14 HTML / CSS
Geekbuying波兰:购买中国电子产品
2019/10/20 全球购物
古驰英国官网:GUCCI英国
2020/03/07 全球购物
小学生开学第一课活动方案
2014/03/27 职场文书
银行内勤岗位职责
2014/04/09 职场文书