java泛型波浪号_DogBrown

article/2025/7/10 8:32:03

对于 Vue.nextTick 方法,自己有些疑惑。在查询了各种资料后,总结了一下其原理和用途,如有错误,请不吝赐教。

概览官方文档说明:用法:

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。疑问:DOM 更新循环是指什么?

下次更新循环是什么时候?

修改数据之后使用,是加快了数据更新进度吗?

在什么情况下要用到?

原理

异步说明Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。

在 Vue 的文档中,说明 Vue 是异步执行 DOM 更新的。关于异步的解析,可以查看阮一峰老师的这篇文章。截取关键部分如下:

具体来说,异步执行的运行机制如下。(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。

(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。

(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。

(4)主线程不断重复上面的第三步。

下图就是主线程和任务队列的示意图。

activities

事件循环说明

简单来说,Vue 在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新。

知乎上的例子://改变数据

vm.message = 'changed'

//想要立即使用更新后的DOM。这样不行,因为设置message后DOM还没有更新

console.log(vm.$el.textContent) // 并不会得到'changed'

//这样可以,nextTick里面的代码会在DOM更新后执行

Vue.nextTick(function(){

console.log(vm.$el.textContent) //可以得到'changed'

})

图解:

activities事件循环:

第一个 tick(图例中第一个步骤,即'本次更新循环'):首先修改数据,这是同步任务。同一事件循环的所有的同步任务都在主线程上执行,形成一个执行栈,此时还未涉及 DOM 。

Vue 开启一个异步队列,并缓冲在此事件循环中发生的所有数据改变。如果同一个 watcher 被多次触发,只会被推入到队列中一次。

第二个 tick(图例中第二个步骤,即'下次更新循环'):

同步任务执行完毕,开始执行异步 watcher 队列的任务,更新 DOM 。Vue 在内部尝试对异步队列使用原生的 Promise.then 和 MessageChannel 方法,如果执行环境不支持,会采用 setTimeout(fn, 0) 代替。

第三个 tick(图例中第三个步骤):

此时就是文档所说的下次 DOM 更新循环结束之后

此时通过 Vue.nextTick 获取到改变后的 DOM 。通过 setTimeout(fn, 0) 也可以同样获取到。

简单总结事件循环:

同步代码执行 -> 查找异步队列,推入执行栈,执行Vue.nextTick[事件循环1] ->查找异步队列,推入执行栈,执行Vue.nextTick[事件循环2]...

总之,异步是单独的一个tick,不会和同步在一个 tick 里发生,也是 DOM 不会马上改变的原因。

用途应用场景:需要在视图更新之后,基于新的视图进行操作。

created、mounted

需要注意的是,在 created 和 mounted 阶段,如果需要操作渲染后的试图,也要使用 nextTick 方法。

官方文档说明:注意 mounted 不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以用 vm.$nextTick 替换掉 mountedmounted: function () {

this.$nextTick(function () {

// Code that will run only after the

// entire view has been rendered

})

}

其他应用场景

其他应用场景如下三例:

例子1:

点击按钮显示原本以 v-show = false 隐藏起来的输入框,并获取焦点。showsou(){

this.showit = true //修改 v-show

document.getElementById("keywords").focus() //在第一个 tick 里,获取不到输入框,自然也获取不到焦点

}

修改为:showsou(){

this.showit = true

this.$nextTick(function () {

// DOM 更新了

document.getElementById("keywords").focus()

})

}

例子2:

点击获取元素宽度。

{{ message }}

获取p元素宽度

getMyWidth() {

this.showMe = true;

//this.message = this.$refs.myWidth.offsetWidth;

//报错 TypeError: this.$refs.myWidth is undefined

this.$nextTick(()=>{

//dom元素更新后执行,此时能拿到p元素的属性

this.message = this.$refs.myWidth.offsetWidth;

})

}

例子3:

使用 swiper 插件通过 ajax 请求图片后的滑动问题。

实例理解 nextTick 应用

  • {{item}}
  • {{item}}
  1. {{item}}
  1. {{item}}
  1. {{item}}

export default {

data() {

return {

list1: [],

list2: [],

list3: [],

list4: [],

list5: []

}

},

created() {

this.composeList12()

this.composeList34()

this.composeList5()

this.$nextTick(function() {

// DOM 更新了

console.log('finished test ' + new Date().toString(),document.querySelectorAll('.example').length)

})

},

methods: {

composeList12() {

let me = this

let count = 10000

for (let i = 0; i < count; i++) {

this.$set(me.list1, i, 'I am a 测试信息~~啦啦啦' + i)

}

console.log('finished list1 ' + new Date().toString(),document.querySelectorAll('.example').length)

for (let i = 0; i < count; i++) {

this.$set(me.list2, i, 'I am a 测试信息~~啦啦啦' + i)

}

console.log('finished list2 ' + new Date().toString(),document.querySelectorAll('.example').length)

this.$nextTick(function() {

// DOM 更新了

console.log('finished tick1&2 ' + new Date().toString(),document.querySelectorAll('.example').length)

})

},

composeList34() {

let me = this

let count = 10000

for (let i = 0; i < count; i++) {

this.$set(me.list3, i, 'I am a 测试信息~~啦啦啦' + i)

}

console.log('finished list3 ' + new Date().toString(),document.querySelectorAll('.example').length)

this.$nextTick(function() {

// DOM 更新了

console.log('finished tick3 ' + new Date().toString(),document.querySelectorAll('.example').length)

})

setTimeout(me.setTimeout1, 0)

},

setTimeout1() {

let me = this

let count = 10000

for (let i = 0; i < count; i++) {

this.$set(me.list4, i, 'I am a 测试信息~~啦啦啦' + i)

}

console.log('finished list4 ' + new Date().toString(),document.querySelectorAll('.example').length)

me.$nextTick(function() {

// DOM 更新了

console.log('finished tick4 ' + new Date().toString(),document.querySelectorAll('.example').length)

})

},

composeList5() {

let me = this

let count = 10000

this.$nextTick(function() {

// DOM 更新了

console.log('finished tick5-1 ' + new Date().toString(),document.querySelectorAll('.example').length)

})

setTimeout(me.setTimeout2, 0)

},

setTimeout2() {

let me = this

let count = 10000

for (let i = 0; i < count; i++) {

this.$set(me.list5, i, 'I am a 测试信息~~啦啦啦' + i)

}

console.log('finished list5 ' + new Date().toString(),document.querySelectorAll('.example').length)

me.$nextTick(function() {

// DOM 更新了

console.log('finished tick5 ' + new Date().toString(),document.querySelectorAll('.example').length)

})

}

}

}

结果:

activities

参考文章查看原文


http://chatgpt.dhexx.cn/article/E5YALMtd.shtml

相关文章

Linux Watchdog看门狗理解

目录 介绍 简单Watchdog Linux Watchdog daemon Watchdog设备驱动配置 测试Watchdog设备的复位功能 介绍 Watchdog timer&#xff08;看门狗定时器&#xff09;是一种电子计时器&#xff0c;其用于检测和恢复计算机故障。在正常操作期间&#xff0c;计算机定期重置看门狗定…

噪音监测传感系统

远程噪声监测系统是一种新型的环境监测系统&#xff0c;可以实现环境噪声、温度、粉尘、风向等参数的在线自动监测。它利用传感技术、通信技术和计算机及其网络技术将环境状态有机地结合起来&#xff0c;形成一起来。  原理  首先&#xff0c;远程噪声监测现场噪声测量控制…

Matlab——噪声的检测和处理实验

本次实验首先由matlab中的randn()函数模拟噪声信号&#xff0c;模拟确定性信号s(t)的抽样信号&#xff0c;并根据有无信号到达的概率&#xff0c;计算两者出现的频数&#xff0c;在matlab软件中仿真出有信号到达和无信号到达的两种接受信号。在此基础上&#xff0c;根据似然比和…

【去噪】A Physics-Based Noise Formation Model for Extreme Low-Light Raw Denoising噪声建模详解

文章目录 0. 前言1. 主要贡献1.1 建立了一个全面的噪声模型&#xff0c;可以准确地描述低光环境下的真实噪声结构1.2 提出了一种噪声参数标定方法1.2.1 估计系统总体增益 K K K1.2.2 估计颜色偏差噪声的 μ c \mu_c μc​1.2.3 估计行噪声的σr1.2.4 估计读出噪声中的λ、σT …

【Android工具】用手机测量噪声的工具软件,噪声仪分贝计,量化噪声声音工具...

今天分享一个通过手机麦克风测量环境噪声的工具——声级计&#xff08;噪声仪&#xff09;。 本来是要分享另一款的&#xff0c;但下载下来的是xapk的安装包&#xff0c;太麻烦了&#xff0c;功能差不多&#xff0c;大家就先用这款吧&#xff0c;有条件的朋友可以去play自己下载…

噪声系数评估的简易方法

1. 概要 有三种常用的噪声系数的测量方法[1]&#xff0c;分别是&#xff1a; 噪声系数测试仪法增益法Y系数法 这些测量方法都需要利用复杂的测试仪器&#xff0c;有没有更简单的方法呢&#xff1f;本文介绍一个简单的仅需要RF信号发生器以及一个能采集数据的设备&#xff08;比…

图像传感器噪声建模与分析

图像传感器在做信号采集的时候往往会引入噪声&#xff0c;在采集到的raw图像中能够拿到没有经过任何处理的传感器信号&#xff0c;因此对于传感器噪声进行分析与建模有助于我们认识传感器噪声&#xff0c;从而帮助我们设计raw图像的降噪算法。本文从传感器模型层面分析单像素点…

气象插值软件anusplin的使用

气象插值软件anusplin的使用 1、简介 ANUSPLIN软件包提供了一种使用薄板平滑样条对噪声多变量数据进行透明分析和插值的工具。该软件包通过提供全面的统计分析、数据诊断和空间分布的标准误差来支持这一过程。通常运用到降水、气温等气象要素的插值当中&#xff0c;可以引入高…

【模拟CMOS集成电路】电路噪声—— 噪声分析基础(1)

电路噪声——噪声分析基础&#xff08;1&#xff09; 前言1噪声的定义2噪声的描述2.1统计特性&#xff08;1&#xff09;平均功率&#xff08;2&#xff09;功率谱密度&#xff08;PSD&#xff09; 2.2噪声相关指标&#xff08;1&#xff09;SNR&#xff08;2&#xff09;SNDR …

IPEmotion的NVH噪声测试模块——坎贝尔图

德国IPETRONIK的IPEmotion软件除了可以对之前介绍的热管理试验及热管理台架试验、电性能试验和道路试验等各种进行基本的温度、模拟量和数字信号的采集分析外&#xff0c;无论专业版、开发版还是分析版均支持噪声分析模块。该模块支持噪声数据离线后处理&#xff0c;包括Campbe…

ADC噪声全面分析 -02- ADC 噪声测量方法和相关参数

ADC 噪声测量方法和参数 在解释如何测量 ADC 噪声之前&#xff0c;重要的是要了解&#xff0c;当您查看 ADC 数据表规格时&#xff0c;相关指标参数表征对象是 ADC&#xff0c;而不是设计的电子系统。因此&#xff0c;ADC 制造商测试 ADC 噪声的方式和测试系统本身应该展示 AD…

频谱分析仪测量噪声系数方法介绍

用频谱仪测量噪声系数&#xff1a;测量框图为&#xff1a;基于噪声系数的定义得到的一个测量公式为&#xff1a;NFPNOUT-(-174dBm/Hz20lg(BW)Gain)(1)公式中&#xff0c;PNOUT是已测的总共输出噪声功率&#xff0c;-174dBm/Hz是290oK&#xff08;室温&#xff09;时环境噪声的功…

频谱分析仪怎么测相位噪声?

相位噪声是评估和分析信号质量的一个重要参数&#xff0c;尤其在无线通信、雷达信号处理等领域中具有重要的意义。罗德&#xff08;Rohde & Schwarz&#xff09;频谱分析仪是一款常见的仪器&#xff0c;可以用于测量和分析信号的相位噪声。本文将详细介绍罗德频谱分析仪相位…

声学仿真分析工具Acoustics 在Workbench中这样学

声学仿真分析工具Acoustics 在Workbench中这样学 付亚兰 讲师 2年前 浏览11376 关注 声学有限元仿真 主要用于模拟声压波在声介质中的生成、传播、辐射、吸收和反射。随着有限元软件的发展和人们对噪声问题的重视&#xff0c;声学有限元仿真在越来越多的行业得到广泛应用。 比…

Sysnoise5.6安装教程和软件下载

Sysnoise5.6安装教程和软件下载 【尊重 原创&#xff0c;转载请注明出处 】http://blog.csdn.net/guyuealian/article/details/51187240 Sysnoise是目前市场上最先进的声-振分析软件&#xff0c;用户可以利用Sysnoise软件仿真计算机有关设备噪声的各种数据&#xff0c;并能帮助…

【自主推荐】电磁噪声优化软件(ENOS)

ENOS软件主要功能介绍 ENOS软件主界面如下图所示&#xff0c;主要包括&#xff1a;菜单栏、工程树图、属性设置、绘图区、图表设置、模型筛选等区域。 ENOS软件经过不断优化升级&#xff0c;新版本增加了考虑斜极电磁力优化功能&#xff0c;支持反电势、损耗等优化目标&#…

放大器噪声分析计算

1.运放噪声模型 运放构成的同相放大器的噪声模型如下 运放的噪声主要由三部分组成&#xff0c;运放电压噪声&#xff0c;运放电流噪声&#xff0c;和反馈电阻产生的热噪声。三者有效值的平方和再开根号就是总噪声的有效值。现代运放的电流噪声非常小&#xff0c;通常可以忽略…

确认!字节跳动 AI Lab 负责人马维英离职,将赴清华加入张亚勤团队

整理 | 夕颜 出品 | CSDN&#xff08;ID:CSDNnews&#xff09; 近日有媒体爆料称&#xff0c;字节跳动副总裁、人工智能实验室马维英离职&#xff0c;并将赴清华大学智能产业研究院&#xff0c;加入正在筹备该产业院的原百度总裁张亚勤团队。CSDN 向字节跳动方面求证&#xff0…

(二十四)专题地图编制——制图数据操作

专题地图编制——制图数据操作 目录 专题地图编制——制图数据操作 1.复制地图数据框2.旋转制图数据框3.绘制坐标网格3.1经纬网3.2方里格网3.3参考格网 1.复制地图数据框 要复制地图数据框&#xff0c;请按照以下步骤操作&#xff1a; ①在 ArcMap 中打开地图文档。 ②在“表…