Vue中this.$nextTick()的具体使用

作者:Litt_White 时间:2023-07-02 16:59:30 

1、官网说法

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM

核心点有2个:DOM 更新获取更新后的 DOM

DOM 更新,可以理解为:Vue 的DOM更新机制,那 Vue 的DOM更新机制是什么?

2、DOM 更新

首先,我们要知道:Vue实现响应式并不是数据发生变化之后DOM立即变化,而是异步执行DOM更新的。

通过代码我们验证下:不是数据发生变化之后DOM立即变化

<template>
 <div class="test">
   <div>
     <button @click="test" ref="btn">{{ msg }}</button>
   </div>
 </div>
</template>
<script>
export default {
 data () {
   return {
     msg: '按钮'
   }
 },
 methods: {
   test () {
     this.msg = '信息改变了。。。。'
     console.log('打印结果:' + this.$refs.btn.innerText) // 打印结果:按钮
   }
 }
}
</script>

此时log结果是:打印结果:&lsquo;按钮&lsquo;。而不是后来的 &lsquo;信息改变了。。。。&rsquo;
原因:Vue的响应式是异步执行DOM更新

异步执行DOM更新

Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作是非常重要的。然后,在下一个的事件循环 &ldquo;tick" 中,Vue 刷新队列并执行实际(已去重的)工作。

Vue中this.$nextTick()的具体使用

(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。
主线程不断执行任务获取任务执行任务&hellip;&hellip;的过程叫做事件循环

简单的理解
vue在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成以后,再进行视图更新.

为什么不同步进行DOM更新呢?
因为如果同步进行DOM更新,则每次对响应式数据进行修改就都会触发setter -> 通知watcher -> 触发re-render -> 生成new vnode(vdom) -> patch(更新真实DOM)。如果每次修改数据都会走一遍这个流程是非常消耗性能的,所以使用异步更新 DOM 的策略,先对数据修改进行整合再使用最终的整合结果一次性对 DOM 进行更新

3、获取更新后的 DOM

<template>
 <div class="test">
   <div>
     <button @click="test" ref="btn">{{ msg1 }}</button>
   </div>
   <div>
     <button @click="test2" ref="btn">{{ msg2 }}</button>
   </div>
 </div>
</template>
<script>
export default {
 data () {
   return {
     msg1: '按钮1',
     msg2: '按钮2'
   }
 },
 methods: {
   test () {
     this.msg1 = '信息改变了。。。。'
     console.log('打印结果:' + this.$refs.btn.innerText) // 打印结果:按钮
   },
   test2 () {
     this.msg2 = '使用this.$nextTick后'
     this.$nextTick(function () {
       console.log('打印结果:' + this.$refs.btn.innerText) // 打印结果:使用this.$nextTick后
     })
   }
 }
}
</script>

通过使用this.$nextTick,此时的打印结果就可以获取到打印结果:使用this.$nextTick后的信息。

4、小结:this.$nextTick()的使用场景

  • 在Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中。原因是在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进Vue.nextTick()的回调函数中。与之对应的就是mounted钩子函数,因为该钩子函数执行时所有的DOM挂载和渲染都已完成,此时在该钩子函数中进行任何DOM操作都不会有问题 。

  • 在数据变化后要执行的某个操作,当你设置 this.msg1 = &lsquo;信息改变了。。。。&rsquo; ,DOM并不会马上更新,而是在异步队列被清除,也就是下一个事件循环开始时执行更新时才会进行必要的DOM更新。如果此时你想要根据更新的 DOM 状态去做某些事情,就会出现问题。。为了在数据变化之后等待 Vue 完成更新 DOM ,可以在数据变化之后立即使用 Vue.nextTick(callback)这样回调函数在 DOM 更新完成后就会调用

来源:https://blog.csdn.net/Litt_White/article/details/128885148

标签:Vue,this.$nextTick()
0
投稿

猜你喜欢

  • 使用SpringBoot + Redis 实现接口限流的方式

    2023-07-11 00:06:49
  • kali-linux 202202 安装w3af命令行版的详细过程

    2023-07-14 01:34:01
  • python实现用类读取文件数据并计算矩形面积

    2022-05-16 21:11:38
  • pytorch中tensor张量数据类型的转化方式

    2022-03-19 20:07:24
  • Python win32com 操作Exce的l简单方法(必看)

    2022-12-04 10:20:36
  • Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】

    2022-01-04 08:14:09
  • 在 Python 中使用 7zip 备份文件的操作

    2022-10-01 10:05:56
  • JavaScript获取echart曲线上任意点位的值详解

    2024-05-02 16:57:52
  • numpy中的converters和usecols用法详解

    2021-01-23 18:29:29
  • Python实现线性判别分析(LDA)的MATLAB方式

    2022-07-21 02:38:34
  • flask框架中的cookie和session使用

    2023-04-08 03:33:28
  • python 日志模块 日志等级设置失效的解决方案

    2022-01-25 07:27:19
  • mysql的select into给多个字段变量赋值方式

    2024-01-14 08:14:50
  • vue设置导航栏、侧边栏为公共页面的例子

    2024-05-29 22:25:07
  • 浅谈Javascript中的事件流和事件绑定

    2009-07-20 17:13:00
  • 解决linux下使用python打开terminal时报错的问题

    2022-10-06 10:46:25
  • python使用循环打印所有三位数水仙花数的实例

    2022-07-02 09:58:59
  • 关于Python 位运算防坑指南

    2022-06-13 08:06:55
  • python爬取哈尔滨天气信息

    2023-12-10 22:28:05
  • 网页设计求职全攻略

    2008-07-09 18:56:00
  • asp之家 网络编程 m.aspxhome.com