详解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 设置url参数
Jul 08 Javascript
禁止ajax缓存获取程序最新数据的方法
Nov 19 Javascript
简单的ajax连接库分享(不用jquery的ajax)
Jan 19 Javascript
jquery实现勾选复选框触发事件给input赋值
Feb 01 Javascript
常用的JavaScript WEB操作方法分享
Feb 28 Javascript
js文本框走动跑马灯效果代码分享
Aug 25 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
Aug 11 Javascript
JavaScript实现左右下拉框动态增删示例
Mar 09 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
May 20 Javascript
Node.js利用断言模块assert进行单元测试的方法
Sep 28 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
Aug 02 jQuery
js实现整体缩放页面适配移动端
Mar 31 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实现验证码功能
2006/10/09 PHP
php连接mysql数据库代码
2009/03/10 PHP
PHP开发不能违背的安全规则 过滤用户输入
2011/05/01 PHP
php用正则表达式匹配URL的简单方法
2013/11/12 PHP
php生成随机颜色的方法
2014/11/13 PHP
浅谈thinkphp的实例化模型
2015/01/04 PHP
CI框架集成Smarty的方法分析
2016/05/17 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
2016/06/20 PHP
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
2012/02/27 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
jquery validate demo 基础
2015/10/29 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
一次$.getJSON不执行的简单记录
2016/07/19 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
JavaScript中的编码和解码函数
2017/02/15 Javascript
微信小程序开发之数据存储 参数传递 数据缓存
2017/04/13 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
[45:18]完美世界DOTA2联赛循环赛 PXG vs IO 第二场 11.06
2020/11/09 DOTA
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
Django之模型层多表操作的实现
2019/01/08 Python
DRF跨域后端解决之django-cors-headers的使用
2019/01/27 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
python3 Scrapy爬虫框架ip代理配置的方法
2020/01/17 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
python中random模块详解
2021/03/01 Python
行政部主管岗位职责
2013/12/28 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
幼儿教师演讲稿
2014/05/06 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
2015人事行政工作总结范文
2015/05/21 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android