当前位置: 首页 > news >正文

Vue3-nextTick源码阅读记录

本文主要记录 nextTick api 源码的阅读理解,尽量说清一个执行调度机制,如果理解vue2 中nextTick的实现,应该也能很快上手,换汤不换药,一些叫法/名词不太一样。

先看看调度任务 SchedulerJob/SchedulerJobs 类型定义:

interface SchedulerJob extends Function {id?: number // 调度任务权重 - 用于执行顺序控制pre?: boolean // 调度任务是否在 组件更新 update 前执行active?: booleancomputed?: boolean // 关联computedallowRecurse?: boolean // 允许递归ownerInstance?: ComponentInternalInstance // 组件实例
}type SchedulerJobs = SchedulerJob | SchedulerJob[] // 任务队列类型

调度任务的执行涉及两个状态字段:

  • isFlushing:正在清空调度任务队列(正在执行调度任务)
  • isFlushPending:清空调度任务队列逻辑 加入微任务队列

全局调度任务队列:

  • queue: SchedulerJob[] = []组件更新前要执行的调度任务队列,flushIndex 记录正在执行的调度任务的索引,控制新的调度任务可以正确加入队列queue,保证正确执行。
  • pendingPostFlushCbs: SchedulerJob[] = []组件更新后才执行的任务队列。
  • activePostFlushCbs: SchedulerJob[] | null = null 组件更新后才执行且正处于执行过程的任务队列,pendingPostFlushCbs 经过去重(Set)的任务,postFlushIndex 记录正在执行的post类型调度任务的索引,控制新的post调度任务可以正确加入队列queue,保证正确执行。

加入微任务队列方法:

// 全局 Promise,用于将调度任务加入微任务队列
const resolvedPromise = /*#__PURE__*/ Promise.resolve() as Promise<any>
// 全局 Promise,用于将清空调度任务队列的逻辑加入微任务队列,全局唯一
let currentFlushPromise: Promise<void> | null = null

Vue3异步更新机制直接利用 Promise 机制实现,不像Vue2受限制,需要进行兼容判断使用 MutationObserver/setTimeout/setImmediate

先看看 nextTick api:

export function nextTick<T = void>(this: T,fn?: (this: T) => void // 调度任务
): Promise<void> {const p = currentFlushPromise || resolvedPromise // 获取Promise,如果已经执行清空调度任务队列,使用currentFlushPromise,否则,直接使用全局 resolvedPromisereturn fn ? p.then(this ? fn.bind(this) : fn) : p // 将nextTick调度任务加入微任务队列

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CSS的:first-of-type伪类:精确定位特定类型的首子元素
  • 结合ChatGPT与Discord,提高团队合作效率
  • 软件开发者的首选:最佳Bug测试工具Top 10
  • LLM和VLM算法常见面试题
  • 编程学习之路:如何克服挫折感,成为更好的自己
  • JavaScript中设置器和获取器
  • 可集成多模型的机器人开发框架 dora:让机器人编程走向大众
  • 战略合作篇白皮书:深度革新,赋能企业跃迁
  • C# Hashtable
  • 【FESCO福利专区-注册安全分析报告-无验证方式导致安全隐患】
  • 嵌入式智能移动机器人导航系统:状态空间控制算法、路径规划算法、PID控制算法(代码示例)
  • Java学习Day34:图书管理小项目
  • 【威锋网-注册安全分析报告-无验证方式导致安全隐患】
  • ai回答 部署前端项目时需要使用ssh吗
  • 结构开发笔记(五):solidworks软件(四):绘制36x36方块摄像头基座
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • Computed property XXX was assigned to but it has no setter
  • DataBase in Android
  • express如何解决request entity too large问题
  • input实现文字超出省略号功能
  • Java,console输出实时的转向GUI textbox
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • maven工程打包jar以及java jar命令的classpath使用
  • SpiderData 2019年2月25日 DApp数据排行榜
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Spring核心 Bean的高级装配
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 编写符合Python风格的对象
  • 从重复到重用
  • 翻译--Thinking in React
  • 关于List、List?、ListObject的区别
  • 讲清楚之javascript作用域
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 十年未变!安全,谁之责?(下)
  • 数据仓库的几种建模方法
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • (Qt) 默认QtWidget应用包含什么?
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)ObjectiveC 深浅拷贝学习
  • (转)socket Aio demo
  • (轉)JSON.stringify 语法实例讲解
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Remoting学习笔记(三)信道
  • .NET8使用VS2022打包Docker镜像
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net生成的类,跨工程调用显示注释
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • @EnableConfigurationProperties注解使用
  • @JsonFormat与@DateTimeFormat注解的使用