详解vue中$nextTick和$forceUpdate的用法

作者:world_7735 时间:2024-06-05 09:15:44 

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请慎用。

来源:https://www.jianshu.com/p/e63dad12d3d4

标签:vue,$nextTick,$forceUpdate
0
投稿

猜你喜欢

  • 解决Git推送错误non-fast-forward的方法

    2022-09-28 11:07:49
  • 关于python变量的引用以及在底层存储原理

    2021-06-24 07:37:35
  • python实现列表的排序方法分享

    2022-10-06 07:56:01
  • 是在客户端确认还是在服务器端确认?

    2010-07-14 21:05:00
  • vue嵌套组件传参实例分享

    2024-06-07 15:23:11
  • js 客户端打印html 并且去掉页眉、页脚的实例

    2024-04-22 22:24:26
  • python中的 sorted()函数和sort()方法区别

    2022-04-13 05:16:11
  • asp如何让我的网页自动适应客户端的屏幕分辨率?

    2010-05-13 16:38:00
  • SQLSERVER数据库中的5173错误解决方法

    2024-01-23 16:25:58
  • 用CSS3将你的设计带入下个高度[译]

    2009-06-22 13:03:00
  • vue-cli4.5.x快速搭建项目

    2024-04-27 15:52:18
  • 教你用一行Python代码实现GUI图形界面

    2021-10-15 01:38:30
  • C#将图片存放到SQL SERVER数据库中的方法

    2024-01-17 14:44:30
  • python函数与方法的区别总结

    2021-08-21 00:07:51
  • 初识Firebug 全文 — firebug的使用

    2007-10-23 12:54:00
  • vue中使用swiper5方式

    2023-07-02 17:07:03
  • MySQL 参数相关概念及查询更改方法

    2024-01-15 02:17:54
  • 微信企业号开发之微信考勤百度地图定位

    2024-05-08 10:11:47
  • 基于Python实现口罩佩戴检测功能

    2022-08-10 20:18:07
  • Python实战之多种音乐格式批量转换

    2023-07-12 20:24:42
  • asp之家 网络编程 m.aspxhome.com