详解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 DOM操作 基于命令改变页面
May 06 Javascript
js实现拖拽 闭包函数详细介绍
Nov 25 Javascript
登陆成功后自动计算秒数执行跳转
Jan 23 Javascript
window.onerror()的用法与实例分析
Jan 27 Javascript
浅谈jquery的map()和each()方法
Jun 12 Javascript
jQuery模拟select实现下拉菜单功能
Jun 20 Javascript
js实现的简练高效拖拽功能示例
Dec 21 Javascript
JS脚本加载后执行相应回调函数的操作方法
Feb 28 Javascript
微信小程序实现循环动画效果
Jul 16 Javascript
原生JS实现自定义下拉单选选择框功能
Oct 12 Javascript
JavaScript如何操作css
Oct 24 Javascript
浅谈JSON5解决了JSON的两大痛点
Dec 14 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如何实现App常用的秒发功能
2016/08/03 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
用js实现的模拟jquery的animate自定义动画(2.5K)
2010/07/20 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
JS获取后台Cookies值的小例子
2013/03/04 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
2014/05/26 Javascript
JavaScript中获取样式的原生方法小结
2014/10/08 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
详谈LABJS按需动态加载js文件
2015/05/07 Javascript
jQuery实现弹出窗口中切换登录与注册表单
2015/06/05 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
微信小程序联网请求的轮播图
2017/07/07 Javascript
温故知新——JavaScript中的字符串连接问题最全总结(推荐)
2017/08/21 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
JavaScript 中的 this 工作原理
2018/06/20 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
微信小程序仿知乎实现评论留言功能
2018/11/28 Javascript
记录一次完整的react hooks实践
2019/03/11 Javascript
微信小程序使用websocket通讯的demo,含前后端代码,亲测可用
2019/05/22 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
原生js实现轮播图特效
2020/05/04 Javascript
[02:20]DOTA2亚洲邀请赛 IG战队出场宣传片
2015/02/07 DOTA
numpy找出array中的最大值,最小值实例
2018/04/03 Python
Tesserocr库的正确安装方式
2018/10/19 Python
Python中的元组介绍
2019/01/28 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
汽车专业毕业生自荐信
2013/11/03 职场文书
幼儿园中秋节活动方案2013
2014/01/29 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
爱我中华教学反思
2014/04/28 职场文书
心理健康教育主题班会
2015/08/13 职场文书
阿里云日志过滤器配置日志服务
2022/04/09 Servers