搜索内容

您当前的位置:首页 > IT资讯 > 正文

vuenexttick的作用的简单介绍

IT资讯
日期·2024-10-10 09:06

本文目录一览:

VUE 荭this.$畴nextTick(疝)异步刷新页面通俗用法

nextTick文档说明:

vuenexttick的作用的简单介绍vuenexttick的作用的简单介绍


疑问:

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

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

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

知乎 上的例子:

图解:

循环详解:

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

1、首先修改数据褫,这是同偢步任务。同一循环的所有的同步任务都在主线程上执行,形成一个执行栈,此时还未涉及DOM 。

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

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

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

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

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

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

简单总结循环:

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

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

文档说明:

其他应用场景如下三例:

修改为:

原文:

Vu闳e啻.nextTick

Vue 中的 nextTick 涉及到 Vue 中 DOM 的异步更新

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

nextTick,则可以在回调中用的获取更新后的 DOM,API 文档中示例如下:

Vu 骤e 实现响应式并不是数据发生变化之敕后 DOM 立即变化,而怞是按黐一定的策略进行 DOM 的更新。

this.$nextTic的k()的解释是:将回调延迟到瘛下次 DOM 更新循环之后执行。

看了这句话后我的状态是这驺样的:简单

其实这个方法很好理解,也超好用噢。

通俗解释就是(扣个脚解释):this.$nextTick()括号中的东西会放在执行。就这么简单,就算this.$nextTick()放在前面都好,一样放在执行。

贴上例的子:

//点击

dianjishijian(){

/螭/这里面的东西执简单行

this.$n坻extTick(()=>{

alert篪('我在这个点击中执行')

})

a袤lert('我比那哥们儿先执豁行')

},

浅析Vue.nextTi魍ck()原理

nextTick文档说明:

疑问:

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

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

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

知乎 上的例子懤:

图解:

循环详解:

个tick(图例中篪个步骤,即'本次更新循环'):

1、瘛首先薨修改数据,这是同 瞓步任务砥。同一循环的所有的同步任务都在主线程上执行,形成一个执行栈,此时还未涉及D篪OM 。

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

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

同步任务执行完毕,开始执行异步watcher队列的任务,更新DOM 。Vue在内部尝试对异步队列使用原生的 歯Promise.then和MessageChan亜n驺el方法,如果执行环锕境袤不支持,会采用setTimeou介绍t(fn, 0)代替。

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

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

此时通敕过Vue.nextT螭ick获取到喌改变后的DOM 。通过 雠setTimeout(fn, 0)也可以同样获取到。

简单坻总结循环:用的

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

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

文档说明:

其他应用场景如 峁下三例:

修改梼为:

原文:

Vue.nextTick

Vu 骤e 中的 nextTick 涉及到 Vue 中 DOM 的异步更新

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

nextTick,则可以在回调中获取更新后的 鸱DOM,API 文档中示例如下:

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

this.$nextTick()的解释是:将回调延迟到下次 DOM 更新循环之后执行。

看了这句话后我的状态是这样的:

其实这个方法很好理解,也超好用噢。

通俗解藿释就是(扣个脚解释):this.$nextTick()括号中的东西会放在执行。就这么简单,就算this.搒$nextTick()放在前面都好,一样放在 媸执疝行。

贴上例子:

//点击

dianji殠shijian(){

//这里面的东西执行

this.$nextTick(()=>{

alert('我在 瞓这个点击中执行雠'褫)

})

alert('我比那哥们儿先执呪行')

},

首先来了解一下黐JS的运行机制。

JS执行是单线程的,它是基于循环的。

这里主线程的执行过程就是一个丒搒 tick ,而所有的异步结果都是通过任务队列来调度。 Event Loop 分为宏任务和微任务呪,无论是执行宏任务还是微任务,完成后都会进入到一下 tick镬 , 并在两个 tick 之间进行UI渲染 。

由于Vue DOM更新是异步执行的,即修改数据时墀,视嚟图不会立即更新,而是会监听数据变化,并缓存在同一循环中,等同一数据循环中的所有数据变化完成之后,再统一进行视图更新。为了确保得牰到更新咮后的DOM,所以设置了 Vue.next吜Tick() 方法。

是Vue的核心方法之一,文档解释如下:

先简单介晷绍下 MutationObserver :MO是HTML介绍5中的夿API懤,是一个用于监视DOM变动的接口,它可以监听一个DOM对象上发生的子节点删除、属性修改、文本内容修改等。

调用过程是要先给它绑定回调,得到MO实例,这个回调会在MO实例监听到变动时触发。这里MO的回调是放在 microtask 中执行的。

nex伬用的tTick 的实现单一个JS文件来维护它,在 src/core/util/饬ne的xt-tick.js 中。

nextTick 源码主要分为两块:能力检测和根据能力检测以不同俦方式执行回嗤调队列。

由于宏任务耗费的时间是大于微任务的,所以在浏览酬器支篪持的情况下,优先使用微任务。魉如果浏览鳝器不支持微任务,再使用宏任务。

延迟调用优先级如下:

Promise > Mutation俦Observer > setImmediate > setTimeout

next-tic㤘k.js 对外暴绉露了 nextTi用的ck 这一个参数,所以每次调用 Vue.next胄Tick 时会执行:

这里的 callbacks 没有直幚接在 nextTick 中执行回调函数的原因是保证在同一个 殠 tick 内多次籀执行 next 砺Tick ,不会开启多个异步任务懋,而vuenexttick是把这些异步任务雠都压成一个同步任务,在下一个 tick 㤘执行完毕梼。

noop 的定义如下

语法 : Vue.nextTick([callback, contex嚟t])

参数 :

Vue实例方法 vm.$nextTi嗤ck 做了进一步封装,把conte羴xt参数设置成当前Vue实例。

使用 Vue.nextTick() 是为了可以获取更新后的DOM 。

触发时机:在同一循环中的数据变化后,DOM完籀成更新,立即俦执行 Vue.nextTic夿k() 的回调。

应用场景:

2.6 版本菗优先使用 microtask 作为异步延迟包装器,且写法相对简单。而2.5 版本中,nextTick 的实现是 microTimerFunc、macroTimerFunc 组合闳实现的,延迟调用优先级是:幚Promise > setImm咮ediate > 敕MessageChannel > setTimeout,具体见源码。

Vue.nextTick的原理和应用场景

nextTick文档说明:

疑问:

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

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

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

知乎 上的例子:

图解:

循歯环详解:

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

1、首先修改数据,这是同步任务。同一循环的所有的同步任务都在主线程上执行,形成一个执行栈,此时还未涉及DOM 。

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

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

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

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

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

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

简单总结循环:

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

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

文档说明:

其他应用场景如下三例:

修改为:

原文:

vue使用thi峯s.$nextTick()函数

nextTick文档说明:

疑问:

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

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

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

知乎 上的例子:

图解:

循环详解:

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

1、首先修改数据,这是同步任务。同一循环的所有篪的同步任务都在主线程上执行,形成一个执镬行栈,此时还未涉及羴DOM 。

2、Vue开启一个异步队列,并缓冲在此循环中发生的所有数据改变镑。如薨果同一个w简单atcher被多次触发,只会被推入到队列中一次。

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

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

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

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

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

简单总结循环:

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

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

文档说明vuenexttick:

其他应用场景如下三例:

修改为:

原文: 砺 炿

Vue.nextTick

Vue 中的 ne竑xtTick 涉及到 Vue 中 DOM 的异步更新

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

nextTick,则可以在回调中获取更新后的 DOM,竑API vuenexttick文档中示例如下:

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

版权声明:图片、内容均来源于互联网 如有侵权联系k19126499204@163.com 删除