$nextTick 实现原理
Vue 使用 nextTick 来确保数据更新后的 DOM 操作在更新完成后执行。其核心逻辑是将回调放到微任务或宏任务队列中,确保回调在 DOM 更新完成后执行。
Vue.js 会利用不同的浏览器 API 来模拟 nextTick 的延迟执行,通常是通过:
- Promise:在微任务队列中执行。
- 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}
}
实现流程:
- 回调队列:callbacks 用于存储所有通过 nextTick 添加的回调函数。
- 防止重复调用:pending 用于标记当前是否已经在等待刷新回调,避免重复调用。
- 任务优先级选择:Promise 微任务 > MutationObserver>setTimeout(宏任务)
- 执行回调: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 操作在更新完成后执行。其核心逻辑是将回调放到微任务或宏任务队列中,确保回调在 DOM 更新完成后执行。 Vue.js 会利用不同的浏览器 API 来模拟 nextTick 的延迟执行,通常是通过: Promise&#x…...
kelp protocol
道阻且长,行而不辍,未来可期 有很长一段时间我都在互联网到处拾金,but,东拼西凑的,总感觉不踏实,最近在老老实实的看官方文档 & 阅读白皮书 &看合约,挑拣一些重要的部分配上官方的证据,和过路公主or王子分享一下,愿我们早日追赶上公司里那些可望不可及大佬们。…...
Golang--面向对象
Golang语言面向对象编程说明: Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。Golang没有类(class),Go语言的结构体(struct)和其…...
深度学习经典模型之LeNet-5
1 LeNet-5 1.1 模型介绍 LeNet-5是由 L e C u n LeCun LeCun 提出的一种用于识别手写数字和机器印刷字符的卷积神经网络(Convolutional Neural Network,CNN) [ 1 ] ^{[1]} [1],其命名来源于作者 L e C u n LeCun LeCun的名字…...
Abaqus随机骨料过渡区孔隙三维网格插件:Random Agg ITZ Pore 3D (Mesh)
插件介绍 Random Agg ITZ Pore 3D (Mesh) V1.0 - AbyssFish 插件可在Abaqus内参数化建立包含水泥浆基体、粗细骨料、界面过渡区(ITZ)、孔隙在内的多相材料混凝土细观背景网格模型。 模型说明 插件采用材料映射单元的方式,将不同相材料赋值…...
PG数据库 jsonb字段 模糊查询
背景: 项目由于多语言的设计,将字段设置成json字段类型,同时存储中文和英文 页面上通过输入框实现模糊的查询 一、表结构:name字段设置jsonb类型 二、表数据 3、Mybatis编写sql select pp.name ->>zh-CN as pmsProductNam…...
javascript-Web APLs (四)
日期对象 用来表示时间的对象 作用:可以得到当前系统时间 在代码中发现了 new 关键字时,一般将这个操作称为 实例化 //创建一个时间对象并获取时间 //获得当前时间 const date new Date() //获得指定时间 const date new Date(2006-6-6) console.log(…...
Keras 3 示例:开启深度学习之旅
Keras 3 示例:开启深度学习之旅 一、Keras 3 简介 Keras 3是一个强大的深度学习框架,它为开发者提供了简洁、高效的方式来构建和训练神经网络。它在之前版本的基础上进行了改进和优化,具有更好的性能、兼容性和功能扩展性。无论是初学者还是…...
鸿蒙Next如何接入微信支付
大家好,这是我工作中接触到的鸿蒙Next接入微信支付,有使用到,分享给大家,轻松便捷 前提:你已有鸿蒙版本的微信,并且微信余额或绑定银行卡有钱,因为内测的微信暂不支持收红包和转账,2.你的应用已…...
nginx(五):关于location匹配规则那些事
关于location匹配规则那些事 1 概述2 语法3 匹配规则说明3.1 精确匹配3.2 前缀匹配(^~)3.3 正则表达式匹配(\~和\~*)3.4 普通前缀匹配 4 匹配优先级5 注意事项6 总结 大家好,我是欧阳方超,可以我的公众号“…...
【论文阅读】Associative Alignment for Few-shot Image Classification
用于小样本图像分类的关联对齐 引用: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的时候,一直不知道其可以格式化sql语句,导致sql语句看起来比较杂乱,今天就来介绍下DBeaver如何格式化sql语句。 如何格式化sql语句 首先,我们打开一个sql窗口,在里面输入我们要查询的sql语…...
OpenCV C++ 计算两幅图像之间的多尺度结构相似性(MSSIM)
目录 一、定义与背景 二、计算流程 三、性质与特点 四、应用场景 五、代码实现 多尺度结构相似性(MSSIM)是一种用于衡量两幅图像之间相似度的指标,它基于结构相似性(SSIM)指数进行扩展,通过在不同尺度上计算SSIM来评估图像的整体质量。以下是对MSSIM的详细介…...
代码随想录第二十二天
回溯算法理论介绍 回溯算法是一种基于递归思想的算法设计技术,适用于解决需要构造所有解或找到特定解的组合问题。回溯的基本思路是通过系统地搜索所有可能的解决方案,然后逐步撤销不符合要求的选择,回到上一步继续尝试。这种算法最适合应用…...
【k8s】ClusterIP能http访问,但是不能ping 的原因
ClusterIP 服务在 Kubernetes 中是可以访问的,但通常无法通过 ping 命令来测试连通性。这主要是因为 ClusterIP 是一个虚拟 IP 地址,而不是实际分配给某个网络接口的 IP 地址。以下是一些原因和解释: 1. 虚拟 IP 地址 ClusterIP 是一个虚拟…...
【力扣打卡系列】单调栈
坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day20 单调栈 题目描述 解题思路 单调栈 后进先出 记录的数据加在最上面丢掉数据也先从最上面开始 单调性 记录t[i]之前会先把所有小于等于t[i]的数据丢掉,不可能出现上面大下面小的…...
使用docker安装zlmediakit服务(zlm)
zlmediakit安装 zlmediakit安装需要依赖环境和系统配置,所以采用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 作为一名资深程序员越来越感觉到基础知识的重要性,比如设计原则、设计模式、算法等,这些知识的长期积累会让你突破瓶颈实现质的飞跃。鉴于此我决定写一系列与此相关的博客&…...
Transformer究竟是什么?预训练又指什么?BERT
目录 Transformer究竟是什么? 预训练又指什么? BERT的影响力 Transformer究竟是什么? Transformer是一种基于自注意力机制(Self-Attention Mechanism)的神经网络架构,它最初是为解决机器翻译等序列到序列(Seq2Seq)任务而设计的。与传统的循环神经网络(RNN)或卷…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...
