详解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 相关文章推荐
Convert Seconds To Hours
Jun 16 Javascript
Jquery中对数组的操作代码
Aug 12 Javascript
七个很有意思的PHP函数
May 12 Javascript
json的使用小结
Jun 08 Javascript
AngularJS实现动态编译添加到dom中的方法
Nov 04 Javascript
bootstrap laydate日期组件使用详解
Jan 04 Javascript
jquery实现自适应banner焦点图
Feb 16 Javascript
B/S(Web)实时通讯解决方案分享
Apr 06 Javascript
基于javascript中的typeof和类型判断(详解)
Oct 27 Javascript
微信小程序常用的3种提示弹窗实现详解
Sep 19 Javascript
JS表格的动态操作完整示例
Jan 13 Javascript
js Math数学简单使用操作示例
Mar 13 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
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
加速IE的Javascript document输出的方法
2010/12/02 Javascript
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
利用JS实现页面删除并重新排序功能
2016/12/09 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
javascript将list转换成树状结构的实例
2017/09/08 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
微信小程序tabbar底部导航
2018/11/05 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
基于javascript实现贪吃蛇小游戏
2019/11/25 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
详解vue路由
2020/08/05 Javascript
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
echarts浮动显示单位的实现方法示例
2020/12/04 Javascript
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
Python中多线程及程序锁浅析
2015/01/21 Python
python访问系统环境变量的方法
2015/04/29 Python
Python中拆分字符串的操作方法
2019/07/23 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
python3 pathlib库Path类方法总结
2019/12/26 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
python实现ftp文件传输功能
2020/03/20 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
Pytest单元测试框架如何实现参数化
2020/09/05 Python
Java中的异常处理机制的简单原理和应用
2013/04/27 面试题
实习销售业务员自我鉴定
2013/09/21 职场文书
便利店投资创业计划书
2014/02/08 职场文书
助学贷款贫困证明
2014/09/23 职场文书
公安机关正风肃纪剖析材料
2014/10/10 职场文书
小学生交通安全寄语
2015/02/27 职场文书