Vue中nextTick()的理解

article/2025/8/21 9:16:41

目录

前言

一、JavaScript的事件循环机制

1.1执行栈

1.2任务队列

1.2.1宏任务

1.2.2微任务 

1.3事件循环

1.4宏任务与微任务执行例子

二、Vue的异步更新策略

2.1为什么Vue选择异步更新

2.2Vue的异步更新实现

2.3nextTick

2.4使用nextTick的最佳时机


前言

在了解nextTick()之前,需要先了解JavaScript的“事件循环机制”和Vue的“异步更新策略”。

一、JavaScript的事件循环机制

1.1执行栈

JavaScript是“单线程”的,所有代码在“执行栈”中依次执行。

即:在代码中,代码执行顺序为从上至下,依次执行 

console.log('1')
function foo() { console.log('2') }
foo()
console.log('3')
// 执行顺序:1 → 2 → 3

1.2任务队列

异步操作(setTimeout、Promise)等会将回调函数放入任务队列,等待执行栈为空时执行。

即:所有同步代码执行完后,再统一执行需要异步操作的代码

任务队列分为两种:

  • 宏任务:setTimeout、setInterval、I/O操作、UI渲染等
  • 微任务:Promise.then、MutationObeserver

1.2.1宏任务

宏任务是事件循环中的“宏观任务”。

常见场景

  1. 定时器:setTimeout、setInterval
  2. I/O操作:文件读写、网络请求
  3. UI渲染浏览器的DOM更新、布局计算
  4. 事件回调:鼠标点击、键盘输入等事件的回调

执行规则

  1. 事件循环的一个周期内,先执行一个宏任务
  2. 宏任务执行过程中,可以同步产生新的宏任务或微任务
  3. 宏任务执行完毕后,会立即执行所有微任务(直到微任务队列为空)

1.2.2微任务 

微任务是在当前宏任务执行结束后、下一个宏任务开始前执行的“微观任务”,优先级高于宏任务

常见场景

  1. Promise回调:Promise.then()、Promise.catch()
  2. MutationObeserver:监听DOM变化的API
  3. Vue的nextTick:Vue内部基于Promise实现的微任务

执行规则

  1. 微任务会在“当前宏任务执行完毕后,下一个宏任务开始前执行
  2. 统一宏任务中产生的多个微任务会被“批量执行”(清空微任务队列)
  3. 微任务执行过程中可以继续产生新的微任务,这些微任务会立即加入队列并立即执行

1.3事件循环

事件循环的工作流程:

  1. 执行栈所有同步代码执行完毕
  2. 处理“微任务队列”中的所有任务(直到队列为空)
  3. 执行一个宏任务(UI渲染)
  4. 重复步骤2和3

1.4宏任务与微任务执行例子

下面是一个宏任务与微任务的执行示例:

console.log('同步代码开始') // 同步代码// 宏任务 1:setTimeout
setTimeout(() => {console.log('setTimeout 回调(宏任务1)')// 微任务:在宏任务中添加新微任务Promise.resolve().then(() => {console.log('setTimeout 中的微任务')})
}, 0)// 宏任务2:setTimeout
setTimeout(() => {console.log('setTimeout 回调(宏任务2)')
})// 微任务 1:Promise.then
Promise.resolve().then(() => {console.log('Promise.then 回调(微任务)')// 微任务:在微任务中添加新微任务Promise.resolve().then(() => {console.log('微任务中的微任务')})
})console.log('同步代码结束') // 同步代码

执行结果

执行顺序分析

  1. 首先顺序执行所有“同步代码
  2. 之后,执行“微任务队列”中的所有微任务
  3. 之后,从“宏任务队列”中取出一个宏任务执行
  4. 之后,再次执行“微任务队列”中的所有微任务
  5. 之后,再次从“宏任务队列”中取出一个宏任务执行
  6. 最后,微任务队列宏任务队列全部为空,但是事件循环仍然在循环并不断检测宏任务队列微任务队列

二、Vue的异步更新策略

2.1为什么Vue选择异步更新

我们都知道Vue最大的特点在于它的“响应式更新”,但是如果每次数据更新都立即更新DOM,会导致大量的DOM操作,影响性能

// 同步更新会触发三次DOM重渲染
data.count = 1;
data.count = 2;
data.count = 3;// 异步更新只会触发一次DOM重渲染
setTimeout(() => {Promise.resolve().then(() => {data.count = 1;data.count = 2;data.count = 3;})
}, 0);

2.2Vue的异步更新实现

当我们修改Vue响应式数据时:

  1. Vue会将DOM更新延迟到下一个“tick
  2. 同一轮事件循环中的所有数据变更会被“合并
  3. 所有变更处理完成后,Vue会“批量更新DOM

注意

  1. 正因为Vue的“批量更新DOM”,所以在我们修改数据后,无法立即获取更新后的DOM
  2. Vue中的DOM更新是在“微任务阶段”执行的

2.3nextTick

nextTickVue中一个处理“异步操作”的回调函数

nextTick本质上:“将回调函数放入微任务队列”,因此只要执行DOM操作后,接着使用nextTick()即可获取更新后的DOM

注意:

nextTick()的执行时机也可能会影响调用结果,即nextTick()插入微任务队列的先后位置,也将影响结果。

nextTick()可以正确调用微任务队列前面任务已经执行的结果,不能调用nextTick()之后未执行的结果。

详细例子如下:

import { ref, nextTick } from 'vue'
const A = ref(0)
const B = ref(0)// 模拟微任务队列中的三个任务
const enqueueMicrotasks = () => {// 任务1:修改响应式变量APromise.resolve().then(() => {A.value = 100console.log('任务1:修改A为', A.value)})// 任务2:nextTick回调,读取B的最新值nextTick(() => {console.log('任务2:nextTick读取B的值为', B.value) // 输出 0(未被任务3修改)})// 任务3:修改响应式变量BPromise.resolve().then(() => {B.value = 200console.log('任务3:修改B为', B.value)})
}// 执行微任务队列
enqueueMicrotasks()

执行结果:

可以看到,nextTick并没有正确读取B的值,因为B的修改被单独作为一个微任务排放在nextTick()回调的后面,所以自然调取不到。

另一个nextTick()例子:

// 模拟微任务队列中的三个任务
const enqueueMicrotasks = () => {// 任务1:修改响应式变量AA.value = 100// 任务2:nextTick回调,读取B的最新值nextTick(() => {console.log('任务2:nextTick读取B的值为', B.value)console.log('任务2:nextTick读取A的值为', A.value)})// 任务3:修改响应式变量BB.value = 200
}// 另一个微任务队列
const enqueueMicrotasks2 = () => {A.value = 300
}// 执行微任务队列
enqueueMicrotasks()
enqueueMicrotasks2()

执行结果:

结论:

  1. 对响应式数据的修改不被单独作为一个微任务时(即没有放置在Promise.then()里),nextTick()默认会放置在微任务队列的最后
  2. 在Promise.then、Promise.catch中对响应式数据的修改,会单独作为一个微任务放置在微任务队列中,这个时候要正确使用nextTick()回调的位置

2.4使用nextTick的最佳时机

  • 当需要确保DOM已经更新时
  • 当需要访问组件引用或DOM元素时
  • 当需要在数据变更后执行依赖DOM操作时


http://www.hkcw.cn/article/GXAZjyygdK.shtml

相关文章

详细说说Redis分布式锁和ZK分布式锁

在分布式系统中,分布式锁是实现资源互斥访问的核心机制。Redis 和 ZooKeeper(ZK)是两种常用的分布式锁实现方案,但它们的实现原理、优缺点和适用场景存在显著差异。 一、Redis 分布式锁 实现原理 基础命令: SET key v…

特朗普关税政策获批暂时恢复实施 法院裁决反转

当地时间5月29日,美国联邦巡回上诉法院批准特朗普政府的请求,暂时搁置了美国国际贸易法院此前做出的禁止执行特朗普政府依据《国际紧急经济权力法》对多国加征关税措施的裁决。联邦巡回上诉法院在裁决书中表示,在审议相关动议文件期间,美国国际贸易法院作出的判决和永久性禁…

官方通报小车超速坠桥致5死 事故原因正调查

官方通报小车超速坠桥致5死 事故原因正调查!5月19日18时23分,苏某驾驶一辆小汽车搭载4人沿环莞快速路行驶。在虎门一水库特大桥路段,车辆因超速冲破防撞沙桶和护栏后坠桥,导致车上5名司乘人员受伤。尽管被紧急送往医院抢救,但最终不幸全部死亡。事故发生后,市镇两级政府迅…

MTK平台-- 如何在屏幕关闭时过滤组播和广播的数据包

一 前言: 这段时间做了一些MTK平台的开发,关于一些WIFI的优化和大家分享下 当DUT(被测设备)连接到wifi网络时,有许多不重要的组播或广播数据包会在屏幕关闭时唤醒DUT的主机,为了降低功耗,DUT需要过滤这些数据包; MTK固件提供一些客户自定义的功能,如关闭过滤组播和…

交通违法拍照数据集,可识别接打电话,不系安全带的行为,支持YOLO,COCO JSON,VOC XML格式的标注数据集 最高正确识别率可达88.6%

交通违法拍照数据集 数据集概述 数据来源:交通监控摄像头、执法记录仪、公开数据集数据类型:图像、视频、元数据(时间、地点、车辆信息)违法类型标注:接打电话、未系安全带 数据采集与标注方法 采集设备&#xff1…

DMBOK对比知识点对比(2)

1.违背伦理进行数据处理的风险 违背伦理进行数据处理的风险风险

特朗普:5月30日将是马斯克在政府效率部最后一天

当地时间5月29日,美国总统特朗普在社交媒体上发文表示,5月30日将是埃隆马斯克在政府效率部的最后一天,他将于美国东部时间30日13时30分在椭圆形办公室与马斯克举行新闻发布会。美国企业家、政府效率部负责人埃隆马斯克28日在社交媒体上说,他作为“特殊政府雇员”的任期结束…

易经六十四卦象解释数据集分享!智能体知识库收集~

今天给大家分享一个易经六十四卦象解释数据集 ,继续来积累AI相关的资料。 六十四卦,记载于《易经》,每一卦的图像均由两个八卦上下组合而成,每一卦各有六个爻。南宋朱熹说,先画八卦于内,后画八卦于外&#…

使用Zxing导出底部带有文字的二维码

1、引入依赖 <!-- Maven 依赖 --> <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version> </dependency>2、生成二维码 import com.google.zxing.BarcodeFormat; i…

Linux文件操作、文件夹操作

一、文件操作 二、文件夹操作

胖东来红内裤事件案宣判 百万粉丝博主赔偿40万

2025年5月28日,许昌市魏都区人民法院公开审理了许昌市胖东来商贸集团有限公司与段某之间的名誉权纠纷案,并当庭宣判。法院判决段某在其个人抖音账号“两个小段(小)”发布书面道歉信的视频,内容需经法院审核,且发布后30日内不得删除;同时,段某需赔偿许昌市胖东来商贸集团…

【Stable Diffusion 1.5 】在 Unet 中每个 Cross Attention 块中的张量变化过程

系列文章目录 文章目录 系列文章目录前言特征图和注意力图的尺寸差异原因在Break-a-Scene中的具体实现总结 前言 特征图 (Latent) 尺寸和注意力图(attention map)尺寸在扩散模型中有差异&#xff0c;是由于模型架构和注意力机制的特性决定的。 特征图和注意力图的尺寸差异原…

男子酒驾闯卡撞伤交警被刑拘 肇事司机已被控制

5月27日晚,交警在陕西西安莲湖区文景南路与农兴路十字路口附近设卡执勤时,一名男子驾车冲卡,冲毁护栏并撞伤了一名交警。该男子涉嫌酒驾,已被刑拘。事发后,该男子弃车逃离现场,但很快被执勤交警抓获。据事发地商户描述,听到撞击声后,一辆由北向南行驶的黑色商务车冲过道…

南京一公园内出现大量竹节虫 生态环境良好标志

近日,有网民在社交媒体上分享了南京老山国家森林公园内出现大量竹节虫的视频。从视频中可以看到,栏杆上布满了绿色的竹节虫,显得非常密集。29日上午,南京老山国家森林公园的工作人员确认,近期园内确实出现了不少竹节虫。不过,工作人员表示这种昆虫是无害的,不会攻击人类…

黑马点评项目02——商户查询缓存(缓存穿透、缓存雪崩、缓存击穿)以及细节

1.添加redis缓存 StringRedisTemplate 使用的是这个哈&#xff0c;有人可能有疑问&#xff0c;存放的是字符串吗&#xff0c;商铺值应该是个对象才对啊&#xff0c;在细节中解析 代码&#xff1a; Override public Result queryById(Long id) {//查询redis&#xff0c;若存在则…

python学习打卡day39

DAY 39 图像数据与显存 知识点回顾 图像数据的格式&#xff1a;灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 作业&#xff1a;今日代码较少&#xff0c;理解内容即可 1.图像数据的格式&a…

代码随想录打卡|Day50 图论(拓扑排序精讲 、dijkstra(朴素版)精讲 )

图论part08 拓扑排序精讲 代码随想录讲解链接 题目链接 思路 在这个题目之中&#xff0c;个别文件的处理依赖于别的文件&#xff0c;因此&#xff0c;文件的处理顺序十分重要。我们用图来表示文件的处理顺序&#xff0c;文件s指向文件t&#xff0c;则说明如果要正确的处理文…

朱啸虎:曾三次错失宁德时代!

朱啸虎:曾三次错失宁德时代。近日,在腾讯视频《激流第二季》中,投资人朱啸虎谈及自己三次错失宁德时代,投资电池失败损失7000万美金的经历。他表示早期看了宁德时代三次,认为他们的技术不性感,不是最新一代,因而投了掌握美国最新一代技术的波士顿电池。结果最新的技术不…

女子观赏“蓝眼泪”失踪多方搜救 游客夜观奇景失联

5月26日傍晚,浙江台州温岭市松门镇海边的大坑沙村,23岁游客孙女士在徒步时失踪。警方和救援人员在山上和海里搜寻多日,但截至29日上午仍未找到她。孙女士生于2002年,平时与父亲一起在宁波生活。5月26日,她告诉父亲自己出去玩,当晚不回家,随后乘列车前往温岭市。当天下午…

PS linux 基础篇1-AXI_DMA

系列文章目录 文章目录 系列文章目录前言一、AXI DMA ip核二、BD工程三、PS linux工程1.使用开源的xilinx_axidma-master工程验证驱动2.按照其他的开源进行就行&#xff0c;没什么写的了 前言 PL与PS之间快速的接口&#xff0c;本文为LOOP回环测试 一、AXI DMA ip核 MM2S mem…