详解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 相关文章推荐
15 个 JavaScript Web UI 库
May 19 Javascript
yepnope.js 异步加载资源文件
Sep 08 Javascript
jquery 添加节点的几种方法介绍
Sep 04 Javascript
微信JS接口汇总及使用详解
Jan 09 Javascript
jQuery实现的向下图文信息滚动效果
May 03 Javascript
详解AngularJS Filter(过滤器)用法
Dec 28 Javascript
jQuery Ajax使用FormData对象上传文件的方法
Sep 07 Javascript
javascript的几种写法总结
Sep 30 Javascript
JQuery异步提交表单与文件上传功能示例
Jan 12 Javascript
JavaScript模板引擎原理与用法详解
Dec 24 Javascript
微信小程序如何播放腾讯视频的实现
Sep 20 Javascript
JS简易计算器实例讲解
Jun 30 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扩展
2013/06/13 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
写入cookie的JavaScript代码库 cookieLibrary.js
2009/10/24 Javascript
jQuery ready函数滥用分析
2011/02/16 Javascript
JQuery动画和停止动画实例代码
2013/03/01 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
javascript模拟评分控件实现方法
2015/05/13 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
JavaScript性能优化总结之加载与执行
2016/08/11 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
2016/10/14 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
Bootstrap导航简单实现代码
2017/03/06 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
原生js实现随机点餐效果
2019/12/10 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
python数据结构树和二叉树简介
2014/04/29 Python
介绍Python中的一些高级编程技巧
2015/04/02 Python
Python中用函数作为返回值和实现闭包的教程
2015/04/27 Python
Python调用命令行进度条的方法
2015/05/05 Python
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
python3实现UDP协议的服务器和客户端
2017/06/14 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
使用python turtle画高达
2020/01/19 Python
解决django中form表单设置action后无法回到原页面的问题
2020/03/13 Python
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
数学专业毕业生自荐信
2013/11/10 职场文书
新闻系毕业生推荐信
2013/11/16 职场文书
经理助理岗位职责
2015/02/02 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android