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

$nextTick 实现原理

Vue 使用 nextTick 来确保数据更新后的 DOM 操作在更新完成后执行。其核心逻辑是将回调放到微任务或宏任务队列中,确保回调在 DOM 更新完成后执行。

Vue.js 会利用不同的浏览器 API 来模拟 nextTick 的延迟执行,通常是通过:

  1. Promise:在微任务队列中执行。
  2. setTimeout:在宏任务队列中执行(当浏览器不支持 Promise 时)。

Vue.js 的 nextTick 会将回调函数放到合适的队列中执行。通过不同的 异步队列机制 来确保在 DOM 更新后执行回调函数。实现方式如下:

function nextTick(callback) {if (Promise) {Promise.resolve().then(callback);  // 使用 Promise 微任务队列} else if (setImmediate) {setImmediate(callback);  // 支持 setImmediate} else {setTimeout(callback, 0);  // 最终回退到 setTimeout}
}

实现流程:

  1. 回调队列:callbacks 用于存储所有通过 nextTick 添加的回调函数。
  2. 防止重复调用:pending 用于标记当前是否已经在等待刷新回调,避免重复调用。
  3. 任务优先级选择:Promise 微任务 > MutationObserver>setTimeout(宏任务)
  4. 执行回调:flushCallbacks 会执行所有的回调函数,并清空队列。
let callbacks = [];      // 存储回调函数的数组,用于收集 nextTick 的回调
let pending = false;     // 标记当前是否已经在等待刷新回调,防止多次触发function flushCallbacks() {pending = false;       // 重置标记,表示已经进入回调执行阶段// 复制回调数组,防止在执行回调时继续往 callbacks 里添加新的回调const copies = callbacks.slice(0);callbacks.length = 0;  // 清空原始回调数组// 逐个执行回调函数for (let i = 0; i < copies.length; i++) {copies[i]();}
}let timerFunc;// 优先使用 Promise 微任务,其次是 MutationObserver,最后是 setTimeout
if (typeof Promise !== 'undefined') {const p = Promise.resolve();     // 创建一个 resolved 状态的 Promise 实例timerFunc = () => {p.then(flushCallbacks);        // 使用 Promise.then 触发微任务队列中的 flushCallbacks};
} else if (typeof MutationObserver !== 'undefined') {let counter = 1;const observer = new MutationObserver(flushCallbacks);  // 使用 MutationObserver 监听数据变化触发 flushCallbacksconst textNode = document.createTextNode(String(counter)); // 创建文本节点作为观察对象observer.observe(textNode, { characterData: true });    // 监听文本节点的数据变化timerFunc = () => {counter = (counter + 1) % 2;  // 切换 counter 值,触发文本节点变化textNode.data = String(counter); // 触发 MutationObserver 回调};
} else {timerFunc = () => {setTimeout(flushCallbacks, 0); // 最后降级到使用 setTimeout 延迟执行 flushCallbacks};
}function nextTick(cb) {callbacks.push(cb);    // 将回调函数存入 callbacks 数组中if (!pending) {        // 如果没有待处理的回调任务pending = true;      // 设置标记,防止重复触发timerFunc();         // 调用 timerFunc,触发回调执行机制}
}
  • callbacks 存储所有传入的回调函数。

  • pending 标记防止 timerFunc 多次调用,确保只在本次任务队列完成后触发。

  • flushCallbacks 函数会在 timerFunc 被触发时执行,清空原数组 callbacks 并执行所有回调函数。

  • timerFunc 的优先级选择:

    • Promise:优先使用 Promise 的 then 方法,将 flushCallbacks 放入微任务队列,微任务优先于宏任务。
    • MutationObserver:在不支持 Promise 时,使用 MutationObserver 来监听文本节点变化。每次 timerFunc 被调用,都会修改文本节点内容,触发 MutationObserver 回调。
    • setTimeout:如果以上两种都不支持,使用 setTimeout(宏任务)延迟执行。
  • nextTick 将传入的回调 cb 存入 callbacks 队列,并确保 flushCallbacks 仅被触发一次。

相关文章:

$nextTick 实现原理

Vue 使用 nextTick 来确保数据更新后的 DOM 操作在更新完成后执行。其核心逻辑是将回调放到微任务或宏任务队列中&#xff0c;确保回调在 DOM 更新完成后执行。 Vue.js 会利用不同的浏览器 API 来模拟 nextTick 的延迟执行&#xff0c;通常是通过&#xff1a; Promise&#x…...

kelp protocol

道阻且长,行而不辍,未来可期 有很长一段时间我都在互联网到处拾金,but,东拼西凑的,总感觉不踏实,最近在老老实实的看官方文档 & 阅读白皮书 &看合约,挑拣一些重要的部分配上官方的证据,和过路公主or王子分享一下,愿我们早日追赶上公司里那些可望不可及大佬们。…...

Golang--面向对象

Golang语言面向对象编程说明&#xff1a; Golang也支持面向对象编程(OOP)&#xff0c;但是和传统的面向对象编程有区别&#xff0c;并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。Golang没有类(class)&#xff0c;Go语言的结构体(struct)和其…...

深度学习经典模型之LeNet-5

1 LeNet-5 1.1 模型介绍 ​ LeNet-5是由 L e C u n LeCun LeCun 提出的一种用于识别手写数字和机器印刷字符的卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09; [ 1 ] ^{[1]} [1]&#xff0c;其命名来源于作者 L e C u n LeCun LeCun的名字…...

Abaqus随机骨料过渡区孔隙三维网格插件:Random Agg ITZ Pore 3D (Mesh)

插件介绍 Random Agg ITZ Pore 3D (Mesh) V1.0 - AbyssFish 插件可在Abaqus内参数化建立包含水泥浆基体、粗细骨料、界面过渡区&#xff08;ITZ&#xff09;、孔隙在内的多相材料混凝土细观背景网格模型。 模型说明 插件采用材料映射单元的方式&#xff0c;将不同相材料赋值…...

PG数据库 jsonb字段 模糊查询

背景&#xff1a; 项目由于多语言的设计&#xff0c;将字段设置成json字段类型&#xff0c;同时存储中文和英文 页面上通过输入框实现模糊的查询 一、表结构&#xff1a;name字段设置jsonb类型 二、表数据 3、Mybatis编写sql select pp.name ->>zh-CN as pmsProductNam…...

javascript-Web APLs (四)

日期对象 用来表示时间的对象 作用&#xff1a;可以得到当前系统时间 在代码中发现了 new 关键字时&#xff0c;一般将这个操作称为 实例化 //创建一个时间对象并获取时间 //获得当前时间 const date new Date() //获得指定时间 const date new Date(2006-6-6) console.log(…...

Keras 3 示例:开启深度学习之旅

Keras 3 示例&#xff1a;开启深度学习之旅 一、Keras 3 简介 Keras 3是一个强大的深度学习框架&#xff0c;它为开发者提供了简洁、高效的方式来构建和训练神经网络。它在之前版本的基础上进行了改进和优化&#xff0c;具有更好的性能、兼容性和功能扩展性。无论是初学者还是…...

鸿蒙Next如何接入微信支付

大家好&#xff0c;这是我工作中接触到的鸿蒙Next接入微信支付&#xff0c;有使用到&#xff0c;分享给大家&#xff0c;轻松便捷 前提:你已有鸿蒙版本的微信&#xff0c;并且微信余额或绑定银行卡有钱&#xff0c;因为内测的微信暂不支持收红包和转账&#xff0c;2.你的应用已…...

nginx(五):关于location匹配规则那些事

关于location匹配规则那些事 1 概述2 语法3 匹配规则说明3.1 精确匹配3.2 前缀匹配&#xff08;^~&#xff09;3.3 正则表达式匹配&#xff08;\~和\~*&#xff09;3.4 普通前缀匹配 4 匹配优先级5 注意事项6 总结 大家好&#xff0c;我是欧阳方超&#xff0c;可以我的公众号“…...

【论文阅读】Associative Alignment for Few-shot Image Classification

用于小样本图像分类的关联对齐 引用&#xff1a;Afrasiyabi A, Lalonde J F, Gagn C. Associative alignment for few-shot image classification[C]//Computer Vision–ECCV 2020: 16th European Conference, Glasgow, UK, August 23–28, 2020, Proceedings, Part V 16. Spri…...

acmessl.cn提供接口API方式申请免费ssl证书

目录 一、前沿 二、API接口文档 1、证书可申请列表 简要描述 请求URL 请求方式 返回参数说明 备注 2、证书申请 简要描述 请求URL 请求方式 业务参数 返回示例 返回参数说明 备注 3、证书查询 简要描述 请求URL 请求方式 业务参数 返回参数说明 备注 4、证…...

DBeaver如何快速格式化sql语句,真简单!

前言 我之前在使用DBeaver的时候&#xff0c;一直不知道其可以格式化sql语句&#xff0c;导致sql语句看起来比较杂乱&#xff0c;今天就来介绍下DBeaver如何格式化sql语句。 如何格式化sql语句 首先&#xff0c;我们打开一个sql窗口&#xff0c;在里面输入我们要查询的sql语…...

OpenCV C++ 计算两幅图像之间的多尺度结构相似性(MSSIM)

目录 一、定义与背景 二、计算流程 三、性质与特点 四、应用场景 五、代码实现 多尺度结构相似性(MSSIM)是一种用于衡量两幅图像之间相似度的指标,它基于结构相似性(SSIM)指数进行扩展,通过在不同尺度上计算SSIM来评估图像的整体质量。以下是对MSSIM的详细介…...

代码随想录第二十二天

回溯算法理论介绍 回溯算法是一种基于递归思想的算法设计技术&#xff0c;适用于解决需要构造所有解或找到特定解的组合问题。回溯的基本思路是通过系统地搜索所有可能的解决方案&#xff0c;然后逐步撤销不符合要求的选择&#xff0c;回到上一步继续尝试。这种算法最适合应用…...

【k8s】ClusterIP能http访问,但是不能ping 的原因

ClusterIP 服务在 Kubernetes 中是可以访问的&#xff0c;但通常无法通过 ping 命令来测试连通性。这主要是因为 ClusterIP 是一个虚拟 IP 地址&#xff0c;而不是实际分配给某个网络接口的 IP 地址。以下是一些原因和解释&#xff1a; 1. 虚拟 IP 地址 ClusterIP 是一个虚拟…...

【力扣打卡系列】单调栈

坚持按题型打卡&刷&梳理力扣算法题系列&#xff0c;语言为go&#xff0c;Day20 单调栈 题目描述 解题思路 单调栈 后进先出 记录的数据加在最上面丢掉数据也先从最上面开始 单调性 记录t[i]之前会先把所有小于等于t[i]的数据丢掉&#xff0c;不可能出现上面大下面小的…...

使用docker安装zlmediakit服务(zlm)

zlmediakit安装 zlmediakit安装需要依赖环境和系统配置&#xff0c;所以采用docker的方式来安装不容易出错。 docker pull拉取镜像(最新) docker pull zlmediakit/zlmediakit:master然后先运行起来 sudo docker run -d -p 1935:1935 -p 80:80 -p 8554:554 -p 10000:10000 -p …...

SOLID原则-单一职责原则

转载请注明出处:https://blog.csdn.net/dmk877/article/details/143447010 作为一名资深程序员越来越感觉到基础知识的重要性&#xff0c;比如设计原则、设计模式、算法等&#xff0c;这些知识的长期积累会让你突破瓶颈实现质的飞跃。鉴于此我决定写一系列与此相关的博客&…...

Transformer究竟是什么?预训练又指什么?BERT

目录 Transformer究竟是什么? 预训练又指什么? BERT的影响力 Transformer究竟是什么? Transformer是一种基于自注意力机制(Self-Attention Mechanism)的神经网络架构,它最初是为解决机器翻译等序列到序列(Seq2Seq)任务而设计的。与传统的循环神经网络(RNN)或卷…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

C#最佳实践:为何优先使用as或is而非强制转换

C#最佳实践&#xff1a;为何优先使用as或is而非强制转换 在 C# 的编程世界里&#xff0c;类型转换是我们经常会遇到的操作。就像在现实生活中&#xff0c;我们可能需要把不同形状的物品重新整理归类一样&#xff0c;在代码里&#xff0c;我们也常常需要将一个数据类型转换为另…...

【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战

🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...

ubuntu清理垃圾

windows和ubuntu 双系统&#xff0c;ubuntu 150GB&#xff0c;开发用&#xff0c;基本不装太多软件。但是磁盘基本用完。 1、查看home目录 sudo du -h -d 1 $HOME | grep -v K 上面的命令查看$HOME一级目录大小&#xff0c;发现 .cache 有26GB&#xff0c;.local 有几个GB&am…...

机器学习复习3--模型评估

误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异称为&#xff1a;误差&#xff08;error&#xff09;。 误差定义&#xff1a; ①在训练集上的误差称为训练误差&#xff08;training error&#xff09;或经验误差&#xff08;empirical error&#x…...