vue的nextTick是下一次事件循环吗

news2024/9/20 18:54:30

如题,nextTick的回调是在下一次事件循环被执行的吗?

是不是下一次事件循环取决于nextTick的实现,如果是用的微任务,那么就是本次事件循环;否则如果用的是宏任务,那么就是下一次事件循环。

我们看下Vue3中nextTick的源码:

export function nextTick<T = void, R = void>(
  this: T,
  fn?: (this: T) => R,
): Promise<Awaited<R>> {
  const p = currentFlushPromise || resolvedPromise
  return fn ? p.then(this ? fn.bind(this) : fn) : p
}

可以看到它的实现就是使用Promise,所以妥妥的微任务,所以nextTick的回调一定是在当前事件循环的微任务阶段被执行的,而不是下一次事件循环

但是在之前的版本中,nextTick可能会使用setTimeout,源码我们就不贴了。既然使用了setTimeout,就是宏任务,那自然就是下一次事件循环了。

可能是因为nextTick这个名字已经深入人心,所以Vue并没有要更改的意思。

那么接下来问题来了!

既然nextTick是本次事件循环,也就是说页面还没有渲染,那么为什么nextTick的回调可以获取到计算后的DOM结果呢?

这个问题真的困扰了我一段时间?

然后我做了个实验,实验代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
  </head>
<body>
  <button onclick="doClick()">点击</button>
  <h1>Hello</h1>
<script>
  function doClick() {
    document.querySelector('h1').innerText = 'Hi'
    alert(document.querySelector('h1').innerText)
  }
</script>
</body>
</html>

这是纯HTML代码,不是Vue的代码。

你猜一下点击完按钮会发生什么?

结果如下:
在这里插入图片描述
点击确定后:
在这里插入图片描述
我们来解释一下为什么是这个结果。

  • 首先我们点击按钮,触发了doClick事件,这是一个宏任务。
  • 我们在这个宏任务中修改了h1的元素内容为Hi,这是一个同步操作,所以DOM的计算是立刻发生的。因此我们接下来通过alert正确打印了更新后的内容Hi。
  • 但是alert阻止了浏览器的渲染,所以页面看到的还是Hello。
  • 当我们点击确定之后,宏任务doClick执行结束,浏览器开始渲染,页面的内容也被更新成了Hi。

总结下来就一句话,就是DOM的计算是立刻发生的,所以可以立刻获取到结果,但是渲染是异步的

回到nextTick,nextTick为啥能获取到计算后的DOM结果呢?

原因就是nextTick是在异步更新队列之后执行,此时真实的DOM操作已经执行了,所以就可以读取到计算后的DOM结果了。

跟nextTick是不是下一次事件循环没有关系,跟浏览器是不是已经渲染了没有关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1974603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32L051K8U6-开发资料

STM32L051测试 &#xff08;四、Flash和EEPROM的读写&#xff09;-云社区-华为云 (huaweicloud.com) STM32L051测试 &#xff08;四、Flash和EEPROM的读写&#xff09; - 掘金 (juejin.cn) STM32L0 系列 EEPROM 读写&#xff0c;程序卡死&#xff1f;_stm32l0片内eeprom_stm3…

Android studio配置代码模版

一、背景&#xff1a; 在工作中&#xff0c;总是要写一些重复的代码&#xff0c;特别是项目有相关规范时&#xff0c;就会产生很多模版代码&#xff0c;每次要么复制一份&#xff0c;要么重新写一份新的&#xff0c;很麻烦&#xff0c;于是我就在想&#xff0c;能不能像创建一…

tomato靶场

扫描网址端口 访问一下8888 我们用kali扫描一下目录 访问这个目录 产看iofo.php源码&#xff0c;发现里面有文件包含漏洞 访问/etc/passwd/发现确实有文件包含漏洞 远程连接2211端口 利用报错&#xff0c;向日志文件注入木马&#xff0c;利用文件包含漏洞访问日志文件 http:/…

现代前端架构介绍(第二部分):如何将功能架构分为三层

远离JavaScript疲劳和框架大战&#xff0c;了解真正重要的东西 在这个系列的前一部分 《App是如何由不同的构建块构成的》中&#xff0c;我们揭示了现代Web应用是由不同的构建块组成的&#xff0c;每个构建块都承担着特定的角色&#xff0c;如核心、功能等。在这篇文章中&#…

手机市场回暖,为何OPPO却“遇冷”?

在智能手机这片红海中&#xff0c;OPPO曾以其独特的营销策略和创新的产品设计&#xff0c;一度占据国内市场的领先地位。然而&#xff0c;近期的数据却揭示了OPPO正面临前所未有的挑战&#xff0c;销量下滑、库存高企&#xff0c;昔日的辉煌似乎已成过眼云烟。 当整个手机市场逐…

单个或两个及以上java安装与环境变量配置

目录 java下载地址&#xff1a; 1.安装java 1.1 安装程序 1.2选择安装路径 1.3等待安装 2.首先&#xff0c;进入环境变量 2.1 找到设置&#xff08;第一个win11&#xff0c;第二个win10&#xff09; 2.2 进入到系统高级系统设置&#xff08;第一个win11&#xff0c;第二…

快捷生成vue模板插件

Vetur < 就可以选择快捷键

Java多线程实现的两种方式

Java多线程实现的两种方式 1. 继承Thread类2. 实现Runnable接口3.总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1. 继承Thread类 直接继承java.lang.Thread类&#xff0c;并重写其run方法。这种方式简单直接&#xff0c;但限制了类…

Python3接口测试框架的整体布局与设计

实战项目整体布局概览 本实战项目基本的层级结构如下&#xff1a; 习惯性的命名规则&#xff0c;把所有的辅助类py文件放在commonsrc这个包里面&#xff0c;如数据库配置封装文件、接口配置封装文件等&#xff1b;辅助类py文件在整个项目中初期代码写好后一般是不会去大范围修…

Character.AI的联合创始人Noam Shazeer将加入谷歌;又一个开源平替llamacoder;和mem0一样的动态记忆框架

✨ 1: Character.AI 创始人回归google Character.AI的联合创始人Noam Shazeer将加入谷歌 Character.AI的联合创始人Noam Shazeer和Daniel De Freitas离开公司&#xff0c;重新加入Google旗下的DeepMind研究团队。Google签署了一项非独占性协议&#xff0c;使用Character.AI的…

Java8新特性(二) Stream与Optional详解

Java8新特性&#xff08;二&#xff09; Stream与Optional详解 一. Stream流 1. Stream概述 1.1 基本概念 Stream&#xff08;java.util.stream&#xff09; 是Java 8中新增的一种抽象流式接口&#xff0c;主要用于配合Lambda表达式提高批量数据的计算和处理效率。Stream不是…

远程控制电脑的正确姿势,3大神器助你秒变技术达人!

现在的生活节奏快得跟打鼓似的&#xff0c;不管是在家工作、帮朋友修电脑&#xff0c;还是想控制家里的播放器放个电影&#xff0c;远程控制电脑这事儿越来越重要了。有没有遇到过想用电脑却够不着的尴尬&#xff1f;别急&#xff0c;今天咱们就来看看怎么搞定远程控制电脑&…

快瞳宠物AI识别赋能养宠智能设备,让品牌大有可为

随着国内养宠市场的不断完善与成熟&#xff0c;许多家庭养宠理念从“健康养宠”向“育儿式养宠”的升级&#xff0c;国内宠物行业向高质量发展阶段迈进&#xff0c;宠物经济增长迅猛。报告显示&#xff0c;2024年宠物智能设备货架电商年销售额达2.5亿&#xff0c;增速近30%。内…

记录一次学习过程(msf、cs的使用、横向渗透等等)

目录 用python搭建一个简单的web服务器 代码解释 MSF msfvenom 功能 用途 查看payloads列表 msfconsole 功能 用途 msfvenom和msfconsole配合使用 来个例子 msf会话中用到的一些命令 在windows中net user用法 列出所有用户账户 显示单个用户账户信息 创建用户账…

x-cmd mod | x jq - 轻量级的 JSON 处理工具

目录 简介使用语法参数子命令x jq openx jq repl 简介 jq 是一个轻量级的 JSON 处理工具&#xff0c;是由 Stephen Dolan 于 2012 年开发。 使用语法 x jq [SUB_COMMAND] <#n>参数 参数描述#n继承 jq 子命令或参数选项 子命令 名称描述x jq open用浏览器打开 jqplay…

Axure入门及快速上手的法宝元件库:解锁高效原型设计之旅

在当今快速迭代的数字产品时代&#xff0c;原型设计成为了连接产品创意与实现之间不可或缺的桥梁。Axure RP&#xff0c;作为一款强大的交互原型设计工具&#xff0c;凭借其易用性、灵活性和丰富的功能&#xff0c;成为了设计师和产品经理的首选。它不仅能够帮助用户快速创建高…

Vue3 + cropper 实现裁剪头像的功能(裁剪效果可实时预览、预览图可下载、预览图可上传到SpringBoot后端、附完整的示例代码和源代码)

文章目录 0. 前言1. 裁剪效果&#xff08;可实时预览&#xff09;2. 安装 cropper3. 引入 Vue Cropper3.1 局部引入&#xff08;推荐使用&#xff09;3.2 全局引入 4. 在代码中使用4.1 template部分4.2 script部分 5. 注意事项6. SpringBoot 后端接收图片6.1 UserController.ja…

无线蓝牙耳机哪个品牌好?甄选四款专业蓝牙耳机品牌推荐

随着市场上品牌和型号众多&#xff0c;挑选出最适合自己的蓝牙耳机却变成了一项不小的挑战&#xff0c;不同的用户有着不同的需求——有的人追求音质、有的人注重续航、有的人在意舒适度&#xff0c;还有的人看重的是设计与功能性&#xff0c;那么无线蓝牙耳机哪个品牌好&#…

springboot物流寄查系统-计算机毕业设计源码95192

目 录 1 绪论 1.1 研究背景 1.2选题背景 1.3论文结构与章节安排 2 springboot物流寄查系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2…

Maven实战(三)- Maven仓库

Maven实战&#xff08;三&#xff09;- Maven仓库 文章目录 Maven实战&#xff08;三&#xff09;- Maven仓库1.Maven仓库概念2.仓库布局3.仓库分类3.1.本地仓库3.2.远程仓库3.3.中央仓库3.4.私服 4.远程仓库的配置5.远程仓库认证6.部署构件至远程仓库7.从仓库解析依赖8.镜像 1…