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

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

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

我们看下Vue3中nextTick的源码:

js 复制代码
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结果呢?

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

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

html 复制代码
<!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是不是下一次事件循环没有关系,跟浏览器是不是已经渲染了没有关系。

相关推荐
涵一8 小时前
动态获取git版本号
vue
怪咖码农8 小时前
vue3获取视频时长、码率、格式等视频详细信息
前端·vue·音视频
Zheng1131 天前
【陪诊系统-PC管理端】动态路由
前端·vue
计算机编程指导师2 天前
如何打造在线音乐网站?java springboot架构,vue前端开发,音乐分享新体验
java·spring boot·python·mysql·vue·毕业设计·音乐
飞翔的佩奇2 天前
Java项目: 基于SpringBoot+mybatis+maven+mysql图书馆管理系统(含源码+数据库+任务书+答辩PPT+毕业论文)
java·数据库·spring boot·vue·毕业设计·maven·图书馆管理系统
飞翔的佩奇2 天前
Java项目: 基于SpringBoot+mybatis+maven影城管理系统分前后台(含源码+数据库+答辩PPT+毕业论文)
java·spring boot·vue·毕业设计·maven·mybatis·影城管理系统
飞翔的佩奇2 天前
Java项目: 基于SpringBoot+mybatis+maven+mysql教师工作量管理系统(含源码+数据库+毕业论文)
java·数据库·spring boot·vue·毕业设计·maven·mybatis
飞翔的佩奇2 天前
Java项目: 基于SpringBoot+mysql+maven房屋租赁系统(含源码+数据库+毕业论文)
java·数据库·spring boot·mysql·vue·maven·房屋租赁
Zheng1132 天前
【陪诊系统-H5客户端】订单状态进度条
前端·javascript·vue
小tenten3 天前
echarts 多个3D柱状图
3d·vue·echarts