Heim >Web-Frontend >View.js >Asynchrone Aktualisierung der Vue3-Komponente und Analyse des Quellcodes des NextTick-Laufmechanismus
Wir alle sollten wissen oder gehört haben, dass Komponentenaktualisierungen asynchron sind. Wir wissen auch, dass es Versprechen verwendet, um die eingehenden Rückruffunktionen in Mikrotasks zu integrieren Da es sich also bei allen um asynchrone Aktualisierungen handelt, stellt nextTick sicher, dass der Rückruf ausgeführt wird, nachdem die Komponente aktualisiert wurde, und wann ist es Zeit, ihn in die Warteschlange einzufügen? Bei diesen Fragen gehen wir zum Quellcode, um Antworten zu finden.
Lassen Sie uns zunächst die Auswirkung der Komponentenaktualisierung überprüfen:
const effect = (instance.effect = new ReactiveEffect( componentUpdateFn, () => queueJob(update), // updata: () => effect.run() 返回值 componentUpdateFn // 将effect添加到组件的scope.effects中 instance.scope // track it in component's effect scope ))
Wenn sich die Reaktionsdaten ändern und die Ausführung des Effekts auslösen, wird der () => queueJob(update)
-Planer ausgeführt, also Wir müssen es uns ansehen. Was macht queueJob? 🎜#
// packages/runtime-core/src/scheduler.ts export function queueJob(job: SchedulerJob) { if ( !queue.length || !queue.includes( // queue中是否已经存在相同job job, isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex ) ) { if (job.id == null) { // 向queue添加job queue是一个数组 queue.push(job) } else { queue.splice(findInsertionIndex(job.id), 0, job) } // 执行queueFlush queueFlush() } }Zusammenfassung: #🎜 🎜#
nextTick
function queueFlush() { // isFlushing和isflushPending初始值都是false // 说明当前没有flush任务在执行,也没有flush任务在等待执行 if (!isFlushing && !isFlushPending) { // 初次执行queueFlush将isFlushPending设置为true 表示有flush任务在等待执行 isFlushPending = true // resolvedPromise是promise.resolve() // flushJobs被放到微任务队列中 等待所有同步scheduler执行完毕后执行 // 这样就可以保证flushJobs在一次组件更新中只执行一次 // 更新currentFlushPromise 以供nextTick使用 currentFlushPromise = resolvedPromise.then(flushJobs) } }
Das obige ist der detaillierte Inhalt vonAsynchrone Aktualisierung der Vue3-Komponente und Analyse des Quellcodes des NextTick-Laufmechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!