nexttick(如何使用VuenextTick)

2025-03-03 04:50:32 7

nexttick(如何使用VuenextTick)

大家好,今天小编来为大家解答以下的问题,关于nexttick,如何使用VuenextTick这个很多人还不知道,现在让我们一起来看看吧!

本文目录

如何使用VuenextTick

这次给大家带来如何使用Vue nextTick,使用Vue nextTick的注意事项有哪些,下面就是实战案例,一起来看一下。export default { data () { return { msg: 0 } }, mounted () { this.msg = 1 this.msg = 2 this.msg = 3 }, watch: { msg () { console.log(this.msg) } }}这段脚本执行我们猜测1000m后会依次打印:1、2、3。但是实际效果中,只会输出一次:3。为什么会出现这样的情况?我们来一探究竟。queueWatcher我们定义 watch 监听 msg ,实际上会被Vue这样调用 vm.$watch(keyOrFn, handler, options) 。 $watch 是我们初始化的时候,为 vm 绑定的一个函数,用于创建 Watcher 对象。那么我们看看 Watcher 中是如何处理 handler 的:this.deep = this.user = this.lazy = this.sync = false... update () { if (this.lazy) { this.dirty = true } else if (this.sync) { this.run() } else { queueWatcher(this) } }...初始设定 this.deep = this.user = this.lazy = this.sync = false ,也就是当触发 update 更新的时候,会去执行 queueWatcher 方法:const queue: Array《Watcher》 = let has: { : ?true } = {}let waiting = falselet flushing = false...export function queueWatcher (watcher: Watcher) { const id = watcher.id if (has == null) { has = true if (!flushing) { queue.push(watcher) } else { // if already flushing, splice the watcher based on its id // if already past its id, it will be run next immediately. let i = queue.length - 1 while (i 》 index && queue.id 》 watcher.id) { i-- } queue.splice(i + 1, 0, watcher) } // queue the flush if (!waiting) { waiting = true nextTick(flushSchedulerQueue) } }}这里面的 nextTick(flushSchedulerQueue) 中的 flushSchedulerQueue 函数其实就是 watcher 的视图更新:function flushSchedulerQueue () { flushing = true let watcher, id ... for (index = 0; index 《 queue.length; index++) { watcher = queue id = watcher.id has = null watcher.run() ... }}另外,关于 waiting 变量,这是很重要的一个标志位,它保证 flushSchedulerQueue 回调只允许被置入 callbacks 一次。 接下来我们来看看 nextTick 函数,在说 nexTick 之前,需要你对 Event Loop 、 microTask 、 macroTask 有一定的了解,Vue nextTick 也是主要用到了这些基础原理。如果你还不了解,可以参考我的这篇文章 Event Loop 简介 好了,下面我们来看一下他的实现:export const nextTick = (function () { const callbacks = let pending = false let timerFunc function nextTickHandler () { pending = false const copies = callbacks.slice(0) callbacks.length = 0 for (let i = 0; i 《 copies.length; i++) { copies() } } // An asynchronous deferring mechanism. // In pre 2.4, we used to use microtasks (Promise/MutationObserver) // but microtasks actually has too high a priority and fires in between // supposedly sequential events (e.g. #4521, #6690) or even between // bubbling of the same event (#6566). Technically setImmediate should be // the ideal choice, but it’s not available everywhere; and the only polyfill // that consistently queues the callback after all DOM events triggered in the // same loop is by using MessageChannel. /* istanbul ignore if */ if (typeof setImmediate !== ’undefined’ && isNative(setImmediate)) { timerFunc = () =》 { setImmediate(nextTickHandler) } } else if (typeof MessageChannel !== ’undefined’ && ( isNative(MessageChannel) || // PhantomJS MessageChannel.toString() === ’’ )) { const channel = new MessageChannel() const port = channel.port2 channel.port1.onmessage = nextTickHandler timerFunc = () =》 { port.postMessage(1) } } else /* istanbul ignore next */ if (typeof Promise !== ’undefined’ && isNative(Promise)) { // use microtask in non-DOM environments, e.g. Weex const p = Promise.resolve() timerFunc = () =》 { p.then(nextTickHandler) } } else { // fallback to setTimeout timerFunc = () =》 { setTimeout(nextTickHandler, 0) } } return function queueNextTick (cb?: Function, ctx?: Object) { let _resolve callbacks.push(() =》 { if (cb) { try { cb.call(ctx) } catch (e) { handleError(e, ctx, ’nextTick’) } } else if (_resolve) { _resolve(ctx) } }) if (!pending) { pending = true timerFunc() } // $flow-disable-line if (!cb && typeof Promise !== ’undefined’) { return new Promise((resolve, reject) =》 { _resolve = resolve }) } }})()首先Vue通过 callback 数组来模拟事件队列,事件队里的事件,通过 nextTickHandler 方法来执行调用,而何事进行执行,是由 timerFunc 来决定的。我们来看一下 timeFunc 的定义:if (typeof setImmediate !== ’undefined’ && isNative(setImmediate)) { timerFunc = () =》 { setImmediate(nextTickHandler) } } else if (typeof MessageChannel !== ’undefined’ && ( isNative(MessageChannel) || // PhantomJS MessageChannel.toString() === ’’ )) { const channel = new MessageChannel() const port = channel.port2 channel.port1.onmessage = nextTickHandler timerFunc = () =》 { port.postMessage(1) } } else /* istanbul ignore next */ if (typeof Promise !== ’undefined’ && isNative(Promise)) { // use microtask in non-DOM environments, e.g. Weex const p = Promise.resolve() timerFunc = () =》 { p.then(nextTickHandler) } } else { // fallback to setTimeout timerFunc = () =》 { setTimeout(nextTickHandler, 0) } }可以看出 timerFunc 的定义优先顺序 macroTask --》 microTask ,在没有 Dom 的环境中,使用 microTask ,比如weexsetImmediate、MessageChannel VS setTimeout我们是优先定义 setImmediate 、 MessageChannel 为什么要优先用他们创建macroTask而不是setTimeout? HTML5中规定setTimeout的最小时间延迟是4ms,也就是说理想环境下异步回调最快也是4ms才能触发。Vue使用这么多函数来模拟异步任务,其目的只有一个,就是让回调异步且尽早调用。而MessageChannel 和 setImmediate 的延迟明显是小于setTimeout的。解决问题有了这些基础,我们再看一遍上面提到的问题。因为 Vue 的事件机制是通过事件队列来调度执行,会等主进程执行空闲后进行调度,所以先回去等待所有的进程执行完成之后再去一次更新。这样的性能优势很明显,比如:现在有这样的一种情况,mounted的时候test的值会被++循环执行1000次。 每次++时,都会根据响应式触发 setter-》Dep-》Watcher-》update-》run 。 如果这时候没有异步更新视图,那么每次++都会直接操作DOM更新视图,这是非常消耗性能的。 所以Vue实现了一个 queue 队列,在下一个Tick(或者是当前Tick的微任务阶段)的时候会统一执行 queue 中 Watcher 的run。同时,拥有相同id的Watcher不会被重复加入到该queue中去,所以不会执行1000次Watcher的run。最终更新视图只会直接将test对应的DOM的0变成1000。 保证更新视图操作DOM的动作是在当前栈执行完以后下一个Tick(或者是当前Tick的微任务阶段)的时候调用,大大优化了性能。有趣的问题var vm = new Vue({ el: ’#example’, data: { msg: ’begin’, }, mounted () { this.msg = ’end’ console.log(’1’) setTimeout(() =》 { // macroTask console.log(’3’) }, 0) Promise.resolve().then(function () { //microTask console.log(’promise!’) }) this.$nextTick(function () { console.log(’2’) }) }})这个的执行顺序想必大家都知道先后打印:1、promise、2、3。因为首先触发了 this.msg = ’end’ ,导致触发了 watcher 的 update ,从而将更新操作callback push进入vue的事件队列。this.$nextTick 也为事件队列push进入了新的一个callback函数,他们都是通过 setImmediate --》 MessageChannel --》 Promise --》 setTimeout 来定义 timeFunc 。而 Promise.resolve().then 则是microTask,所以会先去打印promise。在支持 MessageChannel 和 setImmediate 的情况下,他们的执行顺序是优先于 setTimeout 的(在IE11/Edge中,setImmediate延迟可以在1ms以内,而setTimeout有最低4ms的延迟,所以setImmediate比setTimeout(0)更早执行回调函数。其次因为事件队列里,优先收入callback数组)所以会打印2,接着打印3但是在不支持 MessageChannel 和 setImmediate 的情况下,又会通过 Promise 定义 timeFunc ,也是老版本Vue 2.4 之前的版本会优先执行 promise 。这种情况会导致顺序成为了:1、2、promise、3。因为this.msg必定先会触发dom更新函数,dom更新函数会先被callback收纳进入异步时间队列,其次才定义 Promise.resolve().then(function () { console.log(’promise!’)}) 这样的microTask,接着定义 $nextTick 又会被callback收纳。我们知道队列满足先进先出的原则,所以优先去执行callback收纳的对象。相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!推荐阅读:如何操作JS实现透明度渐变动画怎样操作JS实现简单折叠展开动画

this.$nextTick()怎么使用

应用场景 : this.$nextTick() 方法主要是用在 随数据改变而改变的dom应用场景中 ,vue中数据和dom渲染由于是异步的,所以,要让dom结构随数据改变这样的操作都应该放进this. $nextTick() 的回调函数中。 created()中使用的方法时,dom还没有渲染,如果此时在该钩子函数中进行dom赋值数据(或者其它dom操作)时无异于徒劳,所以, created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中 ,而与created()对应的是mounted()的钩子函数则是在dom完全渲染后才开始渲染数据,所以在mounted()中操作dom基本不会存在渲染问题。

简单的理解,vue.js中this.$nextTick()就是起到了一个等待数据的作用,也就是说,将一些回调延迟,等到DOM更新之后再开始执行。简单点说,相当于setTimeout()的作用。

例如: 1.你改变了dom元素数据,然后你又想输出dom,那你只能等到dom更新完成之后才会实现. 2.通过事件改变data数据,然后输出dom,在方法里直接打印的话, 由于dom元素还没有更新, 因此打印出来的还是未改变之前的值,而通过this.$nextTick()获取到的值为dom更新之后的值.

如何使用VuenextTick的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于如何使用VuenextTick、如何使用VuenextTick的信息别忘了在本站进行查找哦。

nexttick(如何使用VuenextTick)

本文编辑:admin
: nexttick,

更多文章:


十大杂牌笔记本电脑:十大杂牌笔记本电脑排行榜最新

十大杂牌笔记本电脑:十大杂牌笔记本电脑排行榜最新

根据广大网友的询问,关于“十大杂牌笔记本电脑排行榜最新”的相关问题,我在此以网站编辑的身份进行解答和解释。首先,需要明确的是,在计算机和电子产品领域,“杂牌”这一词汇并不是一个专业、正式的分类方式。在市场上,笔记本电脑的品牌众多,包括知名品

2025年4月25日 16:30

华为watch2pro表带尺寸(华为watch3pro手表的表带尺寸是多少可以换非官方表带吗)

华为watch2pro表带尺寸(华为watch3pro手表的表带尺寸是多少可以换非官方表带吗)

华为gt242mm与46mm的区别表带不同:华为WATCH GT2的42mm表带宽度为20mm,因为手表软件占用的空间)二、显示屏屏幕类型:康宁大猩猩玻璃屏幕尺寸:1.2英寸屏幕分辨率:390×390华为手表gt表带宽度是多少1、表带宽度不

2024年3月13日 10:00

spf30和spf50的区别(防晒霜spf30和spf50是什么意思)

spf30和spf50的区别(防晒霜spf30和spf50是什么意思)

大家好,今天小编来为大家解答以下的问题,关于spf30和spf50的区别,防晒霜spf30和spf50是什么意思这个很多人还不知道,现在让我们一起来看看吧!本文目录防晒霜spf30和spf50是什么意思防晒霜50spf和30spf有什么区别

2025年12月13日 08:15

索爱sl6蓝牙耳机怎么样,索爱sl6蓝牙耳机怎么样值得买吗

索爱sl6蓝牙耳机怎么样,索爱sl6蓝牙耳机怎么样值得买吗

文章主题:索爱SL6蓝牙耳机怎么样?值得买吗?在如今这个高度数字化的时代,无线蓝牙耳机已经成为了人们日常生活中不可或缺的一部分。而其中,索爱SL6蓝牙耳机以其独特的设计和功能吸引了众多消费者的目光。那么,索爱SL6蓝牙耳机究竟怎么样?是否值

2025年4月20日 23:50

gt740m显卡驱动装不上(我的电脑gt740的显卡驱动安装不上, 我360驱动大师 驱动精灵 驱动人生 都用了 都是安)

gt740m显卡驱动装不上(我的电脑gt740的显卡驱动安装不上, 我360驱动大师 驱动精灵 驱动人生 都用了 都是安)

大家好,gt740m显卡驱动装不上相信很多的网友都不是很明白,包括我的电脑gt740的显卡驱动安装不上, 我360驱动大师 驱动精灵 驱动人生 都用了 都是安也是一样,不过没有关系,接下来就来为大家分享关于gt740m显卡驱动装不上和我的电

2025年5月31日 23:50

苹果7(苹果7plus是哪一年上市的手机)

苹果7(苹果7plus是哪一年上市的手机)

苹果7 Plus——回忆那年令人心动的手机上市时刻一、引言当我们回想起智能手机的发展历程,苹果7 Plus无疑是一个绕不开的里程碑。那么,苹果7 Plus是哪一年上市的手机呢?答案是,它于XXXX年上市,为全球的果粉们带来了前所未有的使用体

2025年4月12日 14:31

笔记本电脑换显卡看型号吗(笔记本显卡型号在哪里看)

笔记本电脑换显卡看型号吗(笔记本显卡型号在哪里看)

各位老铁们,大家好,今天由我来为大家分享笔记本电脑换显卡看型号吗,以及笔记本显卡型号在哪里看的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录笔记本显

2026年2月27日 10:47

小辣椒手机系统下载(小辣椒用的是什么系统)

小辣椒手机系统下载(小辣椒用的是什么系统)

本文目录小辣椒用的是什么系统小辣椒手机能安装小米系统吗小辣椒LA-M1怎么刷机小辣椒手机安卓4.22系统可以在线升级吗问一下 小辣椒手机下载软件为什么安装不了!小辣椒用的是什么系统问题一:魅族小辣椒手机用的是什么系统 魅族的有基于安卓和阿

2024年11月14日 05:10

诺基亚920t——诺基亚920T刷机包

诺基亚920t——诺基亚920T刷机包

诺基亚920T刷机包详解一、引言诺基亚920T作为一款曾经风靡一时的智能手机,其用户群体庞大。随着时间的推移,随着新技术的不断涌现,用户可能希望为手机安装更先进、更个性化的系统,而刷机便成为了一个常见的选择。本文将详细介绍诺基亚920T刷机

2025年4月28日 12:32

三星堆1986年出土文物找到另一半(1986年三星堆考古)

三星堆1986年出土文物找到另一半(1986年三星堆考古)

1986年三星堆考古概述一、背景介绍三星堆,位于中国四川省广汉市南兴镇的三星村,是一处重要的古代文化遗址。这里自20世纪20年代开始陆续有考古发现,但最为举世瞩目的莫过于1986年的那次考古发掘。那一年,三星堆遗址的两次发掘出土了大量珍贵文

2025年4月8日 03:20

广汉三星堆简介(三星堆的地理环境)

广汉三星堆简介(三星堆的地理环境)

大家好,关于广汉三星堆简介很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于三星堆的地理环境的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录三星堆的地理环

2025年5月22日 23:10

天语手机开关机(天语f126手机开关机怎么操作)

天语手机开关机(天语f126手机开关机怎么操作)

本文目录天语f126手机开关机怎么操作天语touch3在哪里设置快速开关机天语手机开不了机怎么办天语T580可以设置自动开关机吗天语A635手机自动开关机如何设置成不询问天语780手机老是自动开关机怎么办天语touch3手机怎么设定定时开关

2024年5月27日 14:00

新手机第一次正确充电(新买的手机电池第一次用该怎样进行充电)

新手机第一次正确充电(新买的手机电池第一次用该怎样进行充电)

大家好,今天小编来为大家解答以下的问题,关于新手机第一次正确充电,新买的手机电池第一次用该怎样进行充电这个很多人还不知道,现在让我们一起来看看吧!本文目录新买的手机电池第一次用该怎样进行充电新手机第一次正确充电新买的手机电池第一次用该怎样进

2025年8月20日 05:39

oppoa9:oppoa9x?

oppoa9:oppoa9x?

OPPO A9x:为你打造的生活场景化解决方案在这个信息时代,手机已成为我们日常生活中不可或缺的伙伴。面对众多品牌和型号的选择,OPPO A9x以其独特的优势,成为众多消费者的首选。它不仅仅是一部手机,更是一个生活场景化的解决方案,让你在各

2025年4月13日 01:31

屏幕壁纸iphone6s(iPhone6s怎么设置动态壁纸苹果6s设置动态壁纸方法)

屏幕壁纸iphone6s(iPhone6s怎么设置动态壁纸苹果6s设置动态壁纸方法)

“屏幕壁纸iphone6s”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看屏幕壁纸iphone6s(iPhone6s怎么设置动态壁纸苹果6s设置动态壁纸方法)!本文目录iPhone6s怎么设置动态壁纸苹果6s设置动态壁纸方法

2025年11月14日 04:15

华为畅享5 VS 华为畅享50参数配置详情表

华为畅享5 VS 华为畅享50参数配置详情表

华为畅享50参数配置详情表内容如下,本说明将按照各参数进行详细阐述,并以场景化解决问题的思维方式进行辅助说明:一、基本参数型号名称:华为畅享50。操作系统:通常为最新的HarmonyOS 2.x(具体版本可能会因发布时间而异)。二、处理器C

2025年4月27日 15:21

mp3格式转换器破解版(mp3  的  adpcm的格式怎么转换成普通格式)

mp3格式转换器破解版(mp3 的 adpcm的格式怎么转换成普通格式)

大家好,今天小编来为大家解答以下的问题,关于mp3格式转换器破解版,mp3 的 adpcm的格式怎么转换成普通格式这个很多人还不知道,现在让我们一起来看看吧!本文目录mp3 的 adpcm的格式怎么转换成普通格式mp3格式转换器 M

2025年3月19日 11:00

联想y580换屏幕(联想Y580N-ISE(A)可以换高清屏吗)

联想y580换屏幕(联想Y580N-ISE(A)可以换高清屏吗)

以后联想Y580能不能换屏幕升级分辩率,给你推荐以下两套1600*900友达B156RW01+高分屏线一套390元1920*1080三星LTN156HT01+高分屏线一套490元联想Y580可以换屏幕吗联想Y580N-ISE能换高清屏吗还有

2024年3月12日 15:30

显卡测试网站(有没有类似DxOMark那样专门测试显卡性能的网站)

显卡测试网站(有没有类似DxOMark那样专门测试显卡性能的网站)

本文目录有没有类似DxOMark那样专门测试显卡性能的网站显示器驱动程序已停止响应并且已恢复有没有好的显卡对比网站求可以在线测试显卡玩游戏帧数的网站GTX670满功耗到底多少瓦怎么说什么的都有国外有一个测试显卡性能的网站,知道的说下gpu-

2024年5月12日 20:30

联想thinkpad怎么样,联想thinkpad系列怎么样

联想thinkpad怎么样,联想thinkpad系列怎么样

好的,以下是我对联想ThinkPad系列电脑的详细解释,希望能帮助大家更好地了解这一系列的电脑产品。一、ThinkPad系列概述ThinkPad是联想集团推出的一款高端商务电脑系列,以其坚固耐用的设计和出色的性能在国内外享有极高的声誉。Th

2025年4月22日 07:43

近期文章

本站热文

480p720p1080p清晰度区别(480P,720P,1080P是什么意思)
2024-10-25 02:50:26 浏览:532
标签列表

热门搜索