


Partager des informations utiles pour vous aider à comprendre Vue.nextTick dans Vue
Cet article partagera avec vous VueDes informations pures et vous présentera Vue.nextTick que vous ne connaissez pas. J'espère qu'il sera utile à tout le monde !
Les amis qui ont utilisé Vue connaissent plus ou moins
$nextTick
~ Avant d'expliquer formellement nextTick, je pense que vous devez clairement savoir que Vue estasynchrone
lors de la mise à jour du DOM. code>, car le prochain processus d'explication sera expliqué avec les mises à jour des composants~ Sans plus tarder, passons directement au sujet (cet article utilise le code source Vue de la version v2.6.14$nextTick
~ 在正式讲解nextTick之前,我想你应该清楚知道 Vue 在更新 DOM 时是异步
执行的,因为接下来讲解过程会结合组件更新一起讲~ 事不宜迟,我们直进主题吧(本文以v2.6.14版本的Vue源码进行讲解)【相关推荐:vuejs视频教程】
一、nextTick小测试
你真的了解nextTick吗?来,直接上题~
<template> <div id="app"> <p ref="name">{{ name }}</p> <button @click="handleClick">修改name</button> </div> </template> <script> export default { name: 'App', data () { return { name: '井柏然' } }, mounted() { console.log('mounted', this.$refs.name.innerText) }, methods: { handleClick () { this.$nextTick(() => console.log('nextTick1', this.$refs.name.innerText)) this.name = 'jngboran' console.log('sync log', this.$refs.name.innerText) this.$nextTick(() => console.log('nextTick2', this.$refs.name.innerText)) } } } </script>
请问上述代码中,当点击按钮“修改name”时,'nextTick1'
,'sync log'
,'nextTick2'
对应的this.$refs.name.innerText
分别会输出什么?注意,这里打印的是DOM的innerText~(文章结尾处会贴出答案)
如果此时的你有非常坚定的答案,那你可以不用继续往下看了~但如果你对自己的答案有所顾虑,那不如跟着我,接着往下看。相信你看完,不需要看到答案都能有个肯定的答案了~!
二、nextTick源码实现
源码位于core/util/next-tick中。可以将其分为4个部分来看,直接上代码
1. 全局变量
callbacks
队列、pending
状态
const callbacks = [] // 存放cb的队列 let pending = false // 是否马上遍历队列,执行cb的标志
2. flushCallbacks
遍历callbacks执行每个cb
function flushCallbacks () { pending = false // 注意这里,一旦执行,pending马上被重置为false const copies = callbacks.slice(0) callbacks.length = 0 for (let i = 0; i < copies.length; i++) { copies[i]() // 执行每个cb } }
3. nextTick
的异步实现
根据执行环境的支持程度采用不同的异步实现策略
let timerFunc // nextTick异步实现fn if (typeof Promise !== 'undefined' && isNative(Promise)) { // Promise方案 const p = Promise.resolve() timerFunc = () => { p.then(flushCallbacks) // 将flushCallbacks包装进Promise.then中 } isUsingMicroTask = true } else if (!isIE && typeof MutationObserver !== 'undefined' && ( isNative(MutationObserver) || MutationObserver.toString() === '[object MutationObserverConstructor]' )) { // MutationObserver方案 let counter = 1 const observer = new MutationObserver(flushCallbacks) // 将flushCallbacks作为观测变化的cb const textNode = document.createTextNode(String(counter)) // 创建文本节点 // 观测文本节点变化 observer.observe(textNode, { characterData: true }) // timerFunc改变文本节点的data,以触发观测的回调flushCallbacks timerFunc = () => { counter = (counter + 1) % 2 textNode.data = String(counter) } isUsingMicroTask = true } else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) { // setImmediate方案 timerFunc = () => { setImmediate(flushCallbacks) } } else { // 最终降级方案setTimeout timerFunc = () => { setTimeout(flushCallbacks, 0) } }
- 这里用个真实案例加深对
MutationObserver
的理解。毕竟比起其他三种异步方案,这个应该是大家最陌生的const observer = new MutationObserver(() => console.log('观测到文本节点变化')) const textNode = document.createTextNode(String(1)) observer.observe(textNode, { characterData: true }) console.log('script start') setTimeout(() => console.log('timeout1')) textNode.data = String(2) // 这里对文本节点进行值的修改 console.log('script end')
Copier après la connexion - 知道对应的输出会是怎么样的吗?
script start
、script end
会在第一轮宏任务中执行,这点没问题setTimeout
会被放入下一轮宏任务执行MutationObserver
是微任务,所以会在本轮宏任务后执行,所以先于setTimeout
- 结果如下图:
4. nextTick
方法实现
cb
、Promise
方式
export function nextTick (cb?: Function, ctx?: Object) { let _resolve // 往全局的callbacks队列中添加cb callbacks.push(() => { if (cb) { try { cb.call(ctx) } catch (e) { handleError(e, ctx, 'nextTick') } } else if (_resolve) { // 这里是支持Promise的写法 _resolve(ctx) } }) if (!pending) { pending = true // 执行timerFunc,在下一个Tick中执行callbacks中的所有cb timerFunc() } // 对Promise的实现,这也是我们使用时可以写成nextTick.then的原因 if (!cb && typeof Promise !== 'undefined') { return new Promise(resolve => { _resolve = resolve }) } }
- 深入细节,理解
pending
有什么用,如何运作?
案例1,同一轮Tick中执行2次$nextTick
,timerFunc
只会被执行一次
this.$nextTick(() => console.log('nextTick1')) this.$nextTick(() => console.log('nextTick2'))
- 用图看看更直观?
三、Vue组件的异步更新
这里如果有对Vue组件化、派发更新不是十分了解的朋友,可以先戳这里,看图解Vue响应式原理了解下Vue组件化和派发更新的相关内容再回来看噢~
Vue的异步更新DOM其实也是使用nextTick
来实现的,跟我们平时使用的$nextTick其实是同一个~
这里我们回顾一下,当我们改变一个属性值的时候会发生什么?
根据上图派发更新过程,我们从watcher.update开时讲起,以渲染Watcher为例,进入到queueWatcher
里
1. queueWatcher
做了什么?
// 用来存放Wathcer的队列。注意,不要跟nextTick的callbacks搞混了,都是队列,但用处不同~ const queue: Array<Watcher> = [] function queueWatcher (watcher: Watcher) { const id = watcher.id // 拿到Wathcer的id,这个id每个watcher都有且全局唯一 if (has[id] == null) { // 避免添加重复wathcer,这也是异步渲染的优化做法 has[id] = true if (!flushing) { queue.push(watcher) } if (!waiting) { waiting = true // 这里把flushSchedulerQueue推进nextTick的callbacks队列中 nextTick(flushSchedulerQueue) } } }
2. flushSchedulerQueue
pour expliquer) [ Recommandations associées : tutoriel vidéo vuejs】
< h2 data-id=" head-0">1. Quiz NextTick- Comprenez-vous vraiment nextTick ? Allez, allez directement à la question~
function flushSchedulerQueue () { currentFlushTimestamp = getNow() flushing = true let watcher, id // 排序保证先父后子执行更新,保证userWatcher在渲染Watcher前 queue.sort((a, b) => a.id - b.id) // 遍历所有的需要派发更新的Watcher执行更新 for (index = 0; index < queue.length; index++) { watcher = queue[index] id = watcher.id has[id] = null // 真正执行派发更新,render -> update -> patch watcher.run() } }
"Modifier le nom", 'nextTick1'
, 'sync log'</ code>, quelle sera la sortie <code>this.$refs.name.innerText
correspondante de 'nextTick2'
? Remarque, ce qui est imprimé ici est le texte interne du DOM~ (la réponse sera publiée à la fin de l'article)
Si vous avez une réponse très ferme à ce moment-là, alors vous n'avez pas besoin de continuez à lire ~ Mais si vous avez raison Si vous avez des inquiétudes concernant votre réponse, pourquoi ne pas me suivre et continuer à lire. Je crois qu'après l'avoir lu, vous aurez une réponse définitive sans avoir à voir la réponse ~ !
2. Implémentation du code source de NextTick
Le code source se trouve dans core/util/next-tick. Il peut être divisé en 4 parties et aller directement dans la file d'attente du code🎜1 Variables globales🎜🎜🎜callbacks
, en attente.
status 🎜this.$nextTick(() => console.log('nextTick1', this.$refs.name.innerText))
this.name = 'jngboran'
console.log('sync log', this.$refs.name.innerText)
this.$nextTick(() => console.log('nextTick2', this.$refs.name.innerText))
Copier après la connexionCopier après la connexion🎜2. flushCallbacks
🎜🎜🎜Traversez les rappels pour exécuter chaque cb🎜rrreee🎜3. Implémentation asynchrone de nextTick
🎜🎜🎜Adopter différentes stratégies d'implémentation asynchrone selon le niveau de support de l'environnement d'exécution🎜rrreee🎜🎜Voici un cas réel à approfondir la compréhension de MutationObserver
. Après tout, comparée aux trois autres solutions asynchrones, celle-ci devrait être la moins familière à tout le monde. Savez-vous à quoi ressemblera le résultat correspondant ? 🎜🎜script start
, script end
sera exécuté lors de la première série de tâches macro, ce n'est pas le cas problème 🎜🎜🎜🎜setTimeout
sera placé dans le prochain cycle d'exécution de la tâche macro🎜🎜🎜🎜MutationObserver
est une micro-tâche, elle sera donc exécutée après ce cycle de tâche de macro, donc d'abord dans setTimeout
🎜🎜🎜🎜🎜 le résultat est le suivant :
🎜🎜🎜4. nextTick< /code> implémentation de la méthode🎜🎜🎜 Méthodes <code>cb
, Promise
🎜rrreee🎜🎜Entrez dans les détails et comprenez à quoi sert en attente
et comment Ça marche? 🎜🎜🎜Cas 1, $nextTick
est exécuté deux fois dans le même tour de Tick, et timerFunc
ne sera exécuté qu'une seule fois
🎜rrreee🎜🎜C'est plus intuitif avec des images ? 🎜🎜🎜
🎜🎜 3. Mises à jour asynchrones des composants Vue🎜🎜S'il y a des amis qui ne sont pas très familiers avec lacomposantation🎜 de Vue et les mises à jour de distribution🎜, vous pouvez d'abord Cliquez ici pour voir l'illustration du principe de réactivité de Vue🎜Comprendre la composantisation de Vue Revenez pour voir le contenu lié aux mises à jour de la distribution~🎜🎜La mise à jour asynchrone de Vue🎜DOM est en fait implémenté à l'aide de nextTick
, qui est en fait le même $nextTick que nous utilisons habituellement~🎜 🎜Ici, nous passons en revue , que se passe-t-il lorsque l'on modifie la valeur d'un attribut ? 🎜🎜
🎜🎜Selon Dans la figure ci-dessus, nous commençons par le processus de mise à jour de répartition lorsque watcher.update est ouvert. En prenant Rendering Watcher🎜 comme exemple, saisissez queueWatcher
🎜 1. Que fait queueWatcher
? 🎜🎜rrreee2. Que fait flushSchedulerQueue
? 🎜🎜rrreee🎜🎜Enfin, une image pour comprendre le processus de mise à jour asynchrone du composant🎜🎜🎜🎜🎜🎜🎜 Quatrièmement, revenons à la question elle-même🎜🎜Je crois qu'après l'analyse ci-dessus du code source de nextTick, nous avons dévoilé son voile mystérieux. À ce stade, vous devez être capable de donner la réponse avec fermeté. Sans plus tarder, vérifions-la ensemble et voyons si c’est ce que vous pensez ! 🎜1、如图所示,mounted
时候的innerText是“井柏然”的中文

2、接下来是点击按钮后,打印结果如图所示

没错,输出结果如下(意不意外?惊不惊喜?)
sync log 井柏然
nextTick1 井柏然
nextTick2 jngboran
下面简单分析一下每个输出:
this.$nextTick(() => console.log('nextTick1', this.$refs.name.innerText))
this.name = 'jngboran'
console.log('sync log', this.$refs.name.innerText)
this.$nextTick(() => console.log('nextTick2', this.$refs.name.innerText))
Copier après la connexionCopier après la connexion
sync log
:这个同步打印没什么好说了,相信大部分童鞋的疑问点都不在这里。如果不清楚的童鞋可以先回顾一下EventLoop,这里不多赘述了~
nextTick1
:注意其虽然是放在$nextTick
的回调中,在下一个tick执行,但是他的位置是在this.name = 'jngboran'
的前。也就是说,他的cb会比App组件的派发更新(flushSchedulerQueue
)更先进入队列,当nextTick1
打印时,App组件还未派发更新,所以拿到的还是旧的DOM值。
nextTick2
就不展开了,大家可以自行分析一下。相信大家对它应该是最肯定的,我们平时不就是这样拿到更新后的DOM吗?
最后来一张图加深理解

写在最后,nextTick其实在Vue中也算是比较核心的一个东西了。因为贯穿整个Vue应用的组件化、响应式的派发更新与其息息相关~深入理解nextTick的背后实现原理,不仅能让你在面试的时候一展风采,更能让你在日常开发工作中,少走弯路少踩坑!好了,本文到这里就暂告一段落了,如果读完能让你有所收获,就帮忙点个赞吧~画图不易、创作艰辛鸭~
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
this.$nextTick(() => console.log('nextTick1', this.$refs.name.innerText)) this.name = 'jngboran' console.log('sync log', this.$refs.name.innerText) this.$nextTick(() => console.log('nextTick2', this.$refs.name.innerText))
flushCallbacks
🎜🎜🎜Traversez les rappels pour exécuter chaque cb🎜rrreee🎜3. Implémentation asynchrone de nextTick
🎜🎜🎜Adopter différentes stratégies d'implémentation asynchrone selon le niveau de support de l'environnement d'exécution🎜rrreee🎜🎜Voici un cas réel à approfondir la compréhension de MutationObserver
. Après tout, comparée aux trois autres solutions asynchrones, celle-ci devrait être la moins familière à tout le monde. Savez-vous à quoi ressemblera le résultat correspondant ? 🎜🎜script start
, script end
sera exécuté lors de la première série de tâches macro, ce n'est pas le cas problème 🎜🎜🎜🎜setTimeout
sera placé dans le prochain cycle d'exécution de la tâche macro🎜🎜🎜🎜MutationObserver
est une micro-tâche, elle sera donc exécutée après ce cycle de tâche de macro, donc d'abord dans setTimeout
🎜🎜🎜🎜🎜 le résultat est le suivant :
🎜🎜🎜4. nextTick< /code> implémentation de la méthode🎜🎜🎜 Méthodes <code>cb
, Promise
🎜rrreee🎜🎜Entrez dans les détails et comprenez à quoi sert en attente
et comment Ça marche? 🎜🎜🎜Cas 1, $nextTick
est exécuté deux fois dans le même tour de Tick, et timerFunc
ne sera exécuté qu'une seule fois
🎜rrreee🎜🎜C'est plus intuitif avec des images ? 🎜🎜🎜
🎜🎜 3. Mises à jour asynchrones des composants Vue🎜🎜S'il y a des amis qui ne sont pas très familiers avec lacomposantation🎜 de Vue et les mises à jour de distribution🎜, vous pouvez d'abord Cliquez ici pour voir l'illustration du principe de réactivité de Vue🎜Comprendre la composantisation de Vue Revenez pour voir le contenu lié aux mises à jour de la distribution~🎜🎜La mise à jour asynchrone de Vue🎜DOM est en fait implémenté à l'aide de nextTick
, qui est en fait le même $nextTick que nous utilisons habituellement~🎜 🎜Ici, nous passons en revue , que se passe-t-il lorsque l'on modifie la valeur d'un attribut ? 🎜🎜
🎜🎜Selon Dans la figure ci-dessus, nous commençons par le processus de mise à jour de répartition lorsque watcher.update est ouvert. En prenant Rendering Watcher🎜 comme exemple, saisissez queueWatcher
🎜 1. Que fait queueWatcher
? 🎜🎜rrreee2. Que fait flushSchedulerQueue
? 🎜🎜rrreee🎜🎜Enfin, une image pour comprendre le processus de mise à jour asynchrone du composant🎜🎜🎜🎜🎜🎜🎜 Quatrièmement, revenons à la question elle-même🎜🎜Je crois qu'après l'analyse ci-dessus du code source de nextTick, nous avons dévoilé son voile mystérieux. À ce stade, vous devez être capable de donner la réponse avec fermeté. Sans plus tarder, vérifions-la ensemble et voyons si c’est ce que vous pensez ! 🎜1、如图所示,mounted
时候的innerText是“井柏然”的中文

2、接下来是点击按钮后,打印结果如图所示

没错,输出结果如下(意不意外?惊不惊喜?)
sync log 井柏然
nextTick1 井柏然
nextTick2 jngboran
下面简单分析一下每个输出:
this.$nextTick(() => console.log('nextTick1', this.$refs.name.innerText))
this.name = 'jngboran'
console.log('sync log', this.$refs.name.innerText)
this.$nextTick(() => console.log('nextTick2', this.$refs.name.innerText))
Copier après la connexionCopier après la connexion
sync log
:这个同步打印没什么好说了,相信大部分童鞋的疑问点都不在这里。如果不清楚的童鞋可以先回顾一下EventLoop,这里不多赘述了~
nextTick1
:注意其虽然是放在$nextTick
的回调中,在下一个tick执行,但是他的位置是在this.name = 'jngboran'
的前。也就是说,他的cb会比App组件的派发更新(flushSchedulerQueue
)更先进入队列,当nextTick1
打印时,App组件还未派发更新,所以拿到的还是旧的DOM值。
nextTick2
就不展开了,大家可以自行分析一下。相信大家对它应该是最肯定的,我们平时不就是这样拿到更新后的DOM吗?
最后来一张图加深理解

写在最后,nextTick其实在Vue中也算是比较核心的一个东西了。因为贯穿整个Vue应用的组件化、响应式的派发更新与其息息相关~深入理解nextTick的背后实现原理,不仅能让你在面试的时候一展风采,更能让你在日常开发工作中,少走弯路少踩坑!好了,本文到这里就暂告一段落了,如果读完能让你有所收获,就帮忙点个赞吧~画图不易、创作艰辛鸭~
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
script start
, script end
sera exécuté lors de la première série de tâches macro, ce n'est pas le cas problème 🎜🎜🎜🎜setTimeout
sera placé dans le prochain cycle d'exécution de la tâche macro🎜🎜🎜🎜MutationObserver
est une micro-tâche, elle sera donc exécutée après ce cycle de tâche de macro, donc d'abord dans setTimeout
🎜🎜🎜🎜🎜 le résultat est le suivant :
4. nextTick< /code> implémentation de la méthode🎜🎜🎜 Méthodes <code>cb
, Promise
🎜rrreee🎜🎜Entrez dans les détails et comprenez à quoi sert en attente
et comment Ça marche? 🎜🎜🎜Cas 1, $nextTick
est exécuté deux fois dans le même tour de Tick, et timerFunc
ne sera exécuté qu'une seule fois
🎜rrreee🎜🎜C'est plus intuitif avec des images ? 🎜🎜🎜
🎜🎜 3. Mises à jour asynchrones des composants Vue🎜🎜S'il y a des amis qui ne sont pas très familiers avec lacomposantation🎜 de Vue et les mises à jour de distribution🎜, vous pouvez d'abord Cliquez ici pour voir l'illustration du principe de réactivité de Vue🎜Comprendre la composantisation de Vue Revenez pour voir le contenu lié aux mises à jour de la distribution~🎜🎜La mise à jour asynchrone de Vue🎜DOM est en fait implémenté à l'aide de nextTick
, qui est en fait le même $nextTick que nous utilisons habituellement~🎜 🎜Ici, nous passons en revue , que se passe-t-il lorsque l'on modifie la valeur d'un attribut ? 🎜🎜
🎜🎜Selon Dans la figure ci-dessus, nous commençons par le processus de mise à jour de répartition lorsque watcher.update est ouvert. En prenant Rendering Watcher🎜 comme exemple, saisissez queueWatcher
🎜 1. Que fait queueWatcher
? 🎜🎜rrreee2. Que fait flushSchedulerQueue
? 🎜🎜rrreee🎜🎜Enfin, une image pour comprendre le processus de mise à jour asynchrone du composant🎜🎜🎜🎜🎜🎜🎜 Quatrièmement, revenons à la question elle-même🎜🎜Je crois qu'après l'analyse ci-dessus du code source de nextTick, nous avons dévoilé son voile mystérieux. À ce stade, vous devez être capable de donner la réponse avec fermeté. Sans plus tarder, vérifions-la ensemble et voyons si c’est ce que vous pensez ! 🎜1、如图所示,mounted
时候的innerText是“井柏然”的中文

2、接下来是点击按钮后,打印结果如图所示

没错,输出结果如下(意不意外?惊不惊喜?)
sync log 井柏然
nextTick1 井柏然
nextTick2 jngboran
下面简单分析一下每个输出:
this.$nextTick(() => console.log('nextTick1', this.$refs.name.innerText))
this.name = 'jngboran'
console.log('sync log', this.$refs.name.innerText)
this.$nextTick(() => console.log('nextTick2', this.$refs.name.innerText))
Copier après la connexionCopier après la connexion
sync log
:这个同步打印没什么好说了,相信大部分童鞋的疑问点都不在这里。如果不清楚的童鞋可以先回顾一下EventLoop,这里不多赘述了~
nextTick1
:注意其虽然是放在$nextTick
的回调中,在下一个tick执行,但是他的位置是在this.name = 'jngboran'
的前。也就是说,他的cb会比App组件的派发更新(flushSchedulerQueue
)更先进入队列,当nextTick1
打印时,App组件还未派发更新,所以拿到的还是旧的DOM值。
nextTick2
就不展开了,大家可以自行分析一下。相信大家对它应该是最肯定的,我们平时不就是这样拿到更新后的DOM吗?
最后来一张图加深理解

写在最后,nextTick其实在Vue中也算是比较核心的一个东西了。因为贯穿整个Vue应用的组件化、响应式的派发更新与其息息相关~深入理解nextTick的背后实现原理,不仅能让你在面试的时候一展风采,更能让你在日常开发工作中,少走弯路少踩坑!好了,本文到这里就暂告一段落了,如果读完能让你有所收获,就帮忙点个赞吧~画图不易、创作艰辛鸭~
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
nextTick
, qui est en fait le même $nextTick que nous utilisons habituellement~🎜 🎜Ici, nous passons en revue , que se passe-t-il lorsque l'on modifie la valeur d'un attribut ? 🎜🎜
queueWatcher
🎜 1. Que fait queueWatcher
? 🎜🎜rrreee2. Que fait flushSchedulerQueue
? 🎜🎜rrreee🎜🎜Enfin, une image pour comprendre le processus de mise à jour asynchrone du composant🎜🎜🎜🎜🎜🎜🎜 Quatrièmement, revenons à la question elle-même🎜🎜Je crois qu'après l'analyse ci-dessus du code source de nextTick, nous avons dévoilé son voile mystérieux. À ce stade, vous devez être capable de donner la réponse avec fermeté. Sans plus tarder, vérifions-la ensemble et voyons si c’est ce que vous pensez ! 🎜1、如图所示,mounted
时候的innerText是“井柏然”的中文

2、接下来是点击按钮后,打印结果如图所示

没错,输出结果如下(意不意外?惊不惊喜?)
sync log 井柏然
nextTick1 井柏然
nextTick2 jngboran
下面简单分析一下每个输出:
this.$nextTick(() => console.log('nextTick1', this.$refs.name.innerText))
this.name = 'jngboran'
console.log('sync log', this.$refs.name.innerText)
this.$nextTick(() => console.log('nextTick2', this.$refs.name.innerText))
Copier après la connexionCopier après la connexion
sync log
:这个同步打印没什么好说了,相信大部分童鞋的疑问点都不在这里。如果不清楚的童鞋可以先回顾一下EventLoop,这里不多赘述了~
nextTick1
:注意其虽然是放在$nextTick
的回调中,在下一个tick执行,但是他的位置是在this.name = 'jngboran'
的前。也就是说,他的cb会比App组件的派发更新(flushSchedulerQueue
)更先进入队列,当nextTick1
打印时,App组件还未派发更新,所以拿到的还是旧的DOM值。
nextTick2
就不展开了,大家可以自行分析一下。相信大家对它应该是最肯定的,我们平时不就是这样拿到更新后的DOM吗?
最后来一张图加深理解

写在最后,nextTick其实在Vue中也算是比较核心的一个东西了。因为贯穿整个Vue应用的组件化、响应式的派发更新与其息息相关~深入理解nextTick的背后实现原理,不仅能让你在面试的时候一展风采,更能让你在日常开发工作中,少走弯路少踩坑!好了,本文到这里就暂告一段落了,如果读完能让你有所收获,就帮忙点个赞吧~画图不易、创作艰辛鸭~
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
flushSchedulerQueue
? 🎜🎜rrreee🎜🎜Enfin, une image pour comprendre le processus de mise à jour asynchrone du composant🎜🎜🎜🎜🎜🎜🎜 Quatrièmement, revenons à la question elle-même🎜🎜Je crois qu'après l'analyse ci-dessus du code source de nextTick, nous avons dévoilé son voile mystérieux. À ce stade, vous devez être capable de donner la réponse avec fermeté. Sans plus tarder, vérifions-la ensemble et voyons si c’est ce que vous pensez ! 🎜1、如图所示,mounted
时候的innerText是“井柏然”的中文
2、接下来是点击按钮后,打印结果如图所示
没错,输出结果如下(意不意外?惊不惊喜?)
sync log 井柏然
nextTick1 井柏然
nextTick2 jngboran
下面简单分析一下每个输出:
this.$nextTick(() => console.log('nextTick1', this.$refs.name.innerText)) this.name = 'jngboran' console.log('sync log', this.$refs.name.innerText) this.$nextTick(() => console.log('nextTick2', this.$refs.name.innerText))
Copier après la connexionCopier après la connexionsync log
:这个同步打印没什么好说了,相信大部分童鞋的疑问点都不在这里。如果不清楚的童鞋可以先回顾一下EventLoop,这里不多赘述了~nextTick1
:注意其虽然是放在$nextTick
的回调中,在下一个tick执行,但是他的位置是在this.name = 'jngboran'
的前。也就是说,他的cb会比App组件的派发更新(flushSchedulerQueue
)更先进入队列,当nextTick1
打印时,App组件还未派发更新,所以拿到的还是旧的DOM值。nextTick2
就不展开了,大家可以自行分析一下。相信大家对它应该是最肯定的,我们平时不就是这样拿到更新后的DOM吗?
最后来一张图加深理解
写在最后,nextTick其实在Vue中也算是比较核心的一个东西了。因为贯穿整个Vue应用的组件化、响应式的派发更新与其息息相关~深入理解nextTick的背后实现原理,不仅能让你在面试的时候一展风采,更能让你在日常开发工作中,少走弯路少踩坑!好了,本文到这里就暂告一段落了,如果读完能让你有所收获,就帮忙点个赞吧~画图不易、创作艰辛鸭~
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

L'utilisation de bootstrap dans vue.js est divisée en cinq étapes: installer bootstrap. Importer un bootstrap dans main.js. Utilisez le composant bootstrap directement dans le modèle. Facultatif: style personnalisé. Facultatif: utilisez des plug-ins.

Vous pouvez ajouter une fonction au bouton VUE en liant le bouton dans le modèle HTML à une méthode. Définissez la logique de la fonction de méthode et d'écriture dans l'instance Vue.

Il existe trois façons de se référer aux fichiers JS dans Vue.js: spécifiez directement le chemin à l'aide du & lt; script & gt; étiqueter;; importation dynamique à l'aide du crochet de cycle de vie monté (); et l'importation via la bibliothèque de gestion de l'État Vuex.

L'option Watch dans Vue.js permet aux développeurs d'écouter des modifications de données spécifiques. Lorsque les données changent, regardez déclenche une fonction de rappel pour effectuer des vues de mise à jour ou d'autres tâches. Ses options de configuration incluent immédiatement, qui spécifie s'il faut exécuter un rappel immédiatement, et profond, ce qui spécifie s'il faut écouter récursivement les modifications des objets ou des tableaux.

Le développement multi-pages VUE est un moyen de créer des applications à l'aide du cadre Vue.js, où l'application est divisée en pages distinctes: Maintenance du code: La division de l'application en plusieurs pages peut rendre le code plus facile à gérer et à maintenir. Modularité: chaque page peut être utilisée comme module séparé pour une réutilisation et un remplacement faciles. Routage simple: la navigation entre les pages peut être gérée par une configuration de routage simple. Optimisation du référencement: chaque page a sa propre URL, ce qui aide le référencement.

Vue.js dispose de quatre méthodes pour revenir à la page précédente: $ router.go (-1) $ router.back () utilise & lt; router-link to = & quot; / & quot; Composant Window.History.back (), et la sélection de la méthode dépend de la scène.

Il existe trois méthodes courantes pour que Vue.js traverse les tableaux et les objets: la directive V-FOR est utilisée pour traverser chaque élément et les modèles de rendu; La directive V-Bind peut être utilisée avec V-FOR pour définir dynamiquement les valeurs d'attribut pour chaque élément; et la méthode .map peut convertir les éléments du tableau en nouveaux tableaux.

Les méthodes pour implémenter le saut d'une balise dans Vue incluent: l'utilisation de la balise A dans le modèle HTML pour spécifier l'attribut HREF. Utilisez le composant routeur-link du routage Vue. Utilisez cette méthode. $ Router.push () dans JavaScript. Les paramètres peuvent être passés à travers le paramètre de requête et les itinéraires sont configurés dans les options de routeur pour les sauts dynamiques.
