详解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 相关文章推荐
JavaScript调用后台的三种方法实例
Oct 17 Javascript
js倒计时小程序
Nov 05 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
Sep 15 Javascript
让angularjs支持浏览器自动填表
Nov 10 Javascript
JavaScript事件代理和委托详解
Apr 08 Javascript
jQuery DataTables插件自定义Ajax分页实例解析
Apr 28 Javascript
浅谈bootstrap源码分析之scrollspy(滚动侦听)
Jun 06 Javascript
Javascript对象字面量的理解
Jun 22 Javascript
Bootstrap Table使用心得总结
Nov 29 Javascript
基于JavaScript实现随机颜色输入框
Dec 10 Javascript
Angular实现响应式表单
Aug 04 Javascript
浅谈Node.js之异步流控制
Oct 25 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 DataGrid 实现代码
2009/08/12 PHP
PHP多态代码实例
2015/06/26 PHP
php下载远程大文件(获取远程文件大小)的实例
2017/06/17 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
理解jQuery stop()方法
2014/11/21 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
JS实现简单表格排序操作示例
2017/10/07 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
2019/03/28 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
2019/11/01 jQuery
TypeScript 运行时类型检查补充工具
2020/09/28 Javascript
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
python实现泊松图像融合
2018/07/26 Python
python pygame模块编写飞机大战
2018/11/20 Python
Python中的pathlib.Path为什么不继承str详解
2019/06/23 Python
Python 中的 global 标识对变量作用域的影响
2019/08/12 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
Python中if有多个条件处理方法
2020/02/26 Python
基于HTML5 Canvas 实现弹出框效果
2017/06/05 HTML / CSS
毕业生多媒体设计求职信
2013/10/12 职场文书
班级体育活动总结
2014/07/05 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
涨价通知
2015/04/23 职场文书
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
SpringBoot连接MySQL获取数据写后端接口的操作方法
2021/11/02 MySQL
5道关于python基础 while循环练习题
2021/11/27 Python
HTML页面点击按钮关闭页面的多种方式
2022/12/24 HTML / CSS