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

剖析vue中nextTick源码

代码逻辑梳理:

  • callbacks 数组用于存储待执行的回调函数,waiting 变量用于标记是否有待执行的回调函数。

  • flushCallbacks 函数用于执行所有存储在 callbacks 数组中的回调函数,并在执行完成后将 waiting 设置为 false。

  • timer 函数根据环境选择合适的定时器来执行回调函数。优先选择 Promise 的微任务执行,如果不支持则尝试使用 MutationObserver,其次是 setImmediate,最后是默认的 setTimeout。

  • nextTick 函数用于将回调函数加入待执行队列,并触发执行。如果当前没有待执行的回调函数,则调用 timer 函数来触发执行,并标记有待执行的回调函数。

整体流程是将回调函数加入队列,通过选择合适的定时器来异步执行这些回调函数,保证它们在下一个微任务或宏任务中被执行

let callbacks = [] // 存储待执行的回调函数
let waiting = false // 标记是否有待执行的回调函数// 执行所有待执行的回调函数
function flushCallbacks() {callbacks.forEach((cb) => cb()) // 依次执行回调函数waiting = false // 标记执行完成
}// 根据环境选择合适的定时器执行回调函数
function timer(flushCallbacks) {let timerFn = () => {} // 默认空函数// 使用 Promiseif (typeof Promise !== 'undefined') {timerFn = () => {Promise.resolve().then(flushCallbacks) // 在微任务中执行回调函数}} else if (typeof MutationObserver !== 'undefined') { // 使用 MutationObserverlet textNode = document.createTextNode(1)let observe = new MutationObserver(flushCallbacks)observe.observe(textNode, {characterData: true})timerFn = () => {textNode.textContent = 3}} else if (typeof setImmediate !== 'undefined') { // 使用 setImmediatetimerFn = () => {setImmediate(flushCallbacks)}} else { // 默认使用 setTimeouttimerFn = () => {setTimeout(flushCallbacks, 0)}}timerFn()
}// 将回调函数加入待执行队列,并触发执行
function nextTick(cb) {callbacks.push(cb) // 将回调函数加入队列if (!waiting) {timer(flushCallbacks) // 触发执行回调函数waiting = true // 标记有待执行的回调函数}
}
http://www.lryc.cn/news/360623.html

相关文章:

  • SSM牙科诊所管理系统-计算机毕业设计源码98077
  • 【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
  • go语言linux安装
  • vi和vim有什么不同?
  • CSS动画效果(鼠标滑过按钮动画)
  • 数据结构(C):从初识堆到堆排序的实现
  • ChatGLM3-6B部署
  • 代码随想录35期Day54-JavaScript
  • 把自己的服务器添加到presearch节点
  • Open3D(C++) OTSU点云二值化
  • 浔川python社获得全网博主原力月度排名泸州地区第二名!
  • 第二站:Java——集合框架的深邃海洋(续)
  • linux系统下,mysql增加用户
  • Java数据结构与算法(最长回文子串中心扩散法)
  • 基于Python网络招聘数据可视化分析系统的设计与实现
  • 【Linux】Linux工具——gcc/g++
  • 【惯性传感器imu】—— WHEELTEC的惯导模块的imu的驱动安装配置和运行
  • Linux提权一
  • Vue.js中如何实现以列表首列为表头
  • 如果孙宇晨和贾跃亭能够握手,或许将会上演新的戏码
  • 渲染100为什么是高性价比网渲平台?渲染100邀请码1a12
  • Jenkins流水线pipeline--基于上一章的工作流程
  • 比较Rust和Haskel
  • RedisTemplate的Long类型使用increment自增报错
  • 【代码随想录训练营】【Day 36】【贪心-3】| Leetcode 1005, 134, 135
  • 2.7HDR与LDR
  • YOLOv5改进(五)-- 轻量化模型MobileNetv3
  • 用户流失分析:如何使用Python训练一个用户流失预测模型?
  • 【计算机毕设】基于SpringBoot的社区医院信息平台设计与实现 - 源码免费(私信领取)
  • LLM——深入探索 ChatGPT在代码解释方面的应用研究