详解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 相关文章推荐
基于jquery的鼠标拖动效果代码
May 30 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
Jun 15 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
Sep 06 Javascript
jQuery Mobile中的button按钮组件基础使用教程
May 23 Javascript
JavaScipt选取文档元素的方法(推荐)
Aug 05 Javascript
jQuery DateTimePicker 日期和时间插件示例
Jan 22 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
Sep 14 Javascript
vue基于Element构建自定义树的示例代码
Sep 19 Javascript
JS实现在文本指定位置插入内容的简单示例
Dec 22 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
May 13 Javascript
关于在LayUI中使用AJAX提交巨坑记录
Oct 25 Javascript
JS函数本身的作用域实例分析
Mar 16 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
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
php扩展ZF――Validate扩展
2008/01/10 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
php实现两个数组相加的方法
2015/02/17 PHP
PHP获取二叉树镜像的方法
2018/01/17 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
2017/02/15 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
jQuery实现全选、反选和不选功能的方法详解
2019/12/04 jQuery
微信小程序 wx.getUserInfo引导用户授权问题实例分析
2020/03/09 Javascript
vue组件添加事件@click.native操作
2020/10/30 Javascript
python交互式图形编程实例(三)
2017/11/17 Python
pandas取出重复数据的方法
2019/07/04 Python
Pytest框架之fixture的详细使用教程
2020/04/07 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
金士达面试非笔试
2012/03/14 面试题
测量实习生自我鉴定
2013/09/19 职场文书
计算机专业毕业生求职信分享
2013/12/24 职场文书
房地产开发计划书
2014/01/10 职场文书
奖励通知
2015/04/22 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
妈妈别哭观后感
2015/06/08 职场文书
主婚人致辞精选
2015/07/28 职场文书
Python3中最常用的5种线程锁实例总结
2021/07/07 Python
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS