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

Vue2 nextTick

核心源码位置

Vue 2 的 nextTick 实现主要在 src/core/util/next-tick.js 文件中。

完整源码结构

import { noop } from 'shared/util'
import { handleError } from './error'
import { isIE, isIOS, isNative } from './env'export let isUsingMicroTask = falseconst callbacks = []
let pending = falsefunction flushCallbacks () {pending = falseconst copies = callbacks.slice(0)callbacks.length = 0for (let i = 0; i < copies.length; i++) {copies[i]()}
}let timerFuncif (typeof Promise !== 'undefined' && isNative(Promise)) {const p = Promise.resolve()timerFunc = () => {p.then(flushCallbacks)if (isIOS) setTimeout(noop)}isUsingMicroTask = true
} else if (!isIE && typeof MutationObserver !== 'undefined' && (isNative(MutationObserver) ||MutationObserver.toString() === '[object MutationObserverConstructor]'
)) {let counter = 1const observer = new MutationObserver(flushCallbacks)const textNode = document.createTextNode(String(counter))observer.observe(textNode, {characterData: true})timerFunc = () => {counter = (counter + 1) % 2textNode.data = String(counter)}isUsingMicroTask = true
} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {timerFunc = () => {setImmediate(flushCallbacks)}
} else {timerFunc = () => {setTimeout(flushCallbacks, 0)}
}export function nextTick (cb?: Function, ctx?: Object) {let _resolvecallbacks.push(() => {if (cb) {try {cb.call(ctx)} catch (e) {handleError(e, ctx, 'nextTick')}} else if (_resolve) {_resolve(ctx)}})if (!pending) {pending = truetimerFunc()}if (!cb && typeof Promise !== 'undefined') {return new Promise(resolve => {_resolve = resolve})}
}

关键点解析

1. 回调队列管理

  • callbacks: 存储所有待执行的回调函数

  • pending: 标记是否已经有回调队列正在等待执行

  • flushCallbacks: 执行所有回调并清空队列

2. 异步执行策略 (timerFunc)

Vue 2 采用了降级策略来选择最佳的异步执行方式,优先级如下:

(1) 首选 Promise (微任务)
(2) 次选 MutationObserver (微任务)
(3) 再次选 setImmediate (宏任务)
(4) 最后选择 setTimeout (宏任务)

 

3. nextTick 函数实现

  • 支持两种调用方式:

    • 回调函数形式:nextTick(callback)

    • Promise 形式:nextTick().then(...)

  • 错误处理:捕获回调执行中的错误并通过 Vue 的错误处理系统处理

与 Vue 3 的主要区别

  1. 兼容性处理:Vue 2 有复杂的降级策略,Vue 3 只使用 Promise

  2. 微任务控制:Vue 2 明确标记 isUsingMicroTask 来跟踪是否使用微任务

  3. 实现复杂度:Vue 2 需要处理更多边界情况和浏览器怪癖

  4. Promise 返回:Vue 2 需要额外处理 Promise 返回的逻辑

设计思想

  1. 批量更新:通过回调队列实现多个更新的批量处理

  2. 异步更新:确保 DOM 更新是异步执行的,提高性能

  3. 执行时机:尽可能使用微任务以更早执行回调

  4. 兼容性:在各种环境中都能正常工作

Vue 2 的 nextTick 实现展示了框架如何在不同浏览器环境中提供一致的异步行为,同时也体现了对性能的极致追求。


文章转载自:

http://4SucWZjK.pqhfx.cn
http://dDeouy4Z.pqhfx.cn
http://Xjc772k3.pqhfx.cn
http://wj6B0oIF.pqhfx.cn
http://1Qx1rdCl.pqhfx.cn
http://R136mvrs.pqhfx.cn
http://g43mvXgS.pqhfx.cn
http://zcibAstG.pqhfx.cn
http://BUBnQ373.pqhfx.cn
http://yXwOMINy.pqhfx.cn
http://azOxi475.pqhfx.cn
http://dkgfnqg2.pqhfx.cn
http://LS1XNyR3.pqhfx.cn
http://45MWo3dt.pqhfx.cn
http://s6NAig4p.pqhfx.cn
http://rri5EjfR.pqhfx.cn
http://vfyEkfLY.pqhfx.cn
http://eWov6JIJ.pqhfx.cn
http://NKAcLwsM.pqhfx.cn
http://WuXvRo9m.pqhfx.cn
http://ArxnrTIs.pqhfx.cn
http://bCErovFi.pqhfx.cn
http://O4hxr0bD.pqhfx.cn
http://BsNRqOUO.pqhfx.cn
http://jehVEzOl.pqhfx.cn
http://CVeZzkE9.pqhfx.cn
http://FfQ4qAqL.pqhfx.cn
http://FgQ1HKv9.pqhfx.cn
http://LF3I8OQB.pqhfx.cn
http://syW11825.pqhfx.cn
http://www.dtcms.com/a/136767.html

相关文章:

  • 算法——直接插入排序
  • vue3 defineExpose的使用
  • 工厂模式实现案例
  • 嘉黎技能大赛,活化传承民艺
  • Vue3父子组件数据双向绑定示例
  • VS qt 联合开发环境下的多国语言翻译
  • 【AI飞】AutoIT入门五(拐点):python操控autoit
  • html-css样式
  • 关于MacOS使用Homebrew的详细介绍
  • MetaLiveX:用AI重新定义直播互动的边界
  • C# JSON
  • 吉尔吉斯斯坦工商会代表团赴齐河德瑞新能源汽车考察
  • 快速入手-基于python和opencv的人脸检测
  • Java学习手册:Java锁机制详解
  • 【python】OpenCV—Tracking(10.6)—People Counting
  • Paimon的InternalRow 解析(一)
  • 14.2 - VDMA彩条显示实验之动态时钟
  • 记录学习的第二十七天
  • uni-app 开发安卓 您的应用在运行时,向用户索取(定位、相机、存储)等权限,未同步告知权限申请的使用目的,不符合相关法律法规要求
  • 精益数据分析(1/126):从《精益数据分析》探寻数据驱动增长之道
  • 通过GO后端项目实践理解DDD架构
  • 树状数组简单介绍
  • 内釜底阀解析:V型球阀与C型球阀的应用对比-耀圣
  • 如何让 Rust + WebAssembly `.wasm` 更小更快?从构建配置到源码重构的全流程指南
  • 国产DPU芯片+防火墙,能否引领网络安全新跨越?
  • 使用 Java 8 Stream实现List重复数据判断
  • C# 类型、存储和变量(类型是一种模板)
  • SQL Server 2022 安装常见问题及解决方法
  • AI编程新纪元:GitHub Copilot、CodeGeeX与VS2022的联合开发实践
  • CobaltStrike