Heim Web-Frontend js-Tutorial Analyse der nextTick-Methode in Vue2.6

Analyse der nextTick-Methode in Vue2.6

Feb 28, 2019 am 11:58 AM
javascript vue.js

Der Inhalt dieses Artikels befasst sich mit der Analyse der nextTick-Methode in Vue2.6. Ich hoffe, dass er für Freunde in Not hilfreich ist.

Eine kurze Analyse der nextTick-Methode in Vue 2.6.

Ereignisschleife

JSs Ereignisschleife und Aufgabenwarteschlange sind tatsächlich der Schlüssel zum Verständnis des Konzepts von nextTick.
Es gibt tatsächlich viele hochwertige Artikel in diesem Internet, die es im Detail vorstellen, daher werde ich kurz darauf eingehen.

Der folgende Inhalt gilt für browserseitiges JS. Der Ereignisschleifenmechanismus von NodeJS ist anders. Die Spezifikation

sieht vor, dass Aufgaben in zwei Kategorien unterteilt werden: task(macrotask) und microtask.

Wird allgemein als Questquelle für task angesehen:

setTimeout / setInterval
setImmediate
MessageChannel
I/O
UI rendering
Nach dem Login kopieren

Wird allgemein als Questquelle für microtask angesehen:

Promise
process.nextTick
MutationObserver
Object.observe(已废弃)
Nach dem Login kopieren

Einfache Übersicht: (Hier sind (die offiziellen Spezifikationen)

  1. Erster StartAusführen des Skriptskripts, bis der Ausführungskontextstapel leer ist, dann mit dem Löschen der Aufgaben in der Mikrotask-Warteschlange. Die Warteschlange wird nach dem Prinzip „Wer zuerst kommt, mahlt zuerst“ bearbeitet. Führen Sie jedes einzelne aus, löschen Sie es und durchlaufen Sie die Ereignisschleife.

  2. Ereignisschleife: Rufen Sie kontinuierlich eine Aufgabe aus der Aufgabenwarteschlange ab, schieben Sie sie zur Ausführung auf den Stapel und führen Sie sie im Strom aus Schleife Löschen Sie die Aufgaben in der Mikrotask-Warteschlange nacheinander. Nach dem Löschen wird möglicherweise das Rendern der Seitenaktualisierung ausgelöst (bestimmt durch den Browser). Wiederholen Sie die Schritte Ereignisschleife

    nach
  3. .

nextTick

Das aktualisierte Rendern von Datenänderungen in Vue zu DOM ist ein asynchroner Prozess.

Diese Methode wird verwendet, um einen verzögerten Rückruf auszuführen, nachdem die DOM-Aktualisierungsschleife endet.
Die Verwendung ist ganz einfach:

// 修改数据
vm.msg = 'Hello';
// DOM 还没有更新
Vue.nextTick(function() {
  // DOM 更新了
});

// 作为一个 Promise 使用
Vue.nextTick().then(function() {
  // DOM 更新了
});
Nach dem Login kopieren
Der Quellcode, ohne Kommentare, hat tatsächlich nur weniger als hundert Zeilen und das Ganze ist trotzdem sehr leicht zu verstehen.

Dies ist in 3 Teile unterteilt.

Modulvariablen

Stellt eingeführte Module und definierte Variablen vor.

// noop 空函数,可用作函数占位符
import { noop } from 'shared/util';

// Vue 内部的错误处理函数
import { handleError } from './error';

// 判断是IE/IOS/内置函数
import { isIE, isIOS, isNative } from './env';

// 使用 MicroTask 的标识符
export let isUsingMicroTask = false;

// 以数组形式存储执行的函数
const callbacks = [];

// nextTick 执行状态
let pending = false;

// 遍历函数数组执行每一项函数
function flushCallbacks() {
  pending = false;
  const copies = callbacks.slice(0);
  callbacks.length = 0;
  for (let i = 0; i < copies.length; i++) {
    copies[i]();
  }
}
Nach dem Login kopieren

Asynchrone Verzögerungsfunktion

Als nächstes kommt die Kernfunktion

Asynchrone Verzögerungsfunktion. Die hier von den verschiedenen Vue-Versionen angewandten Strategien sind tatsächlich unterschiedlich.

2.6 Version bevorzugt die Verwendung von Microtask als asynchronen verzögerten Wrapper.

2.5 Version ist Makrotask kombiniert mit Mikrotask. Es gibt jedoch kleinere Probleme, wenn sich der Status vor dem Neuzeichnen ändert (z. B. #6813). Darüber hinaus kann die Verwendung von macrotask in einem Event-Handler zu seltsamem Verhalten führen, das nicht umgangen werden kann (wie #7109, #7153, #7546, #7834, #8109).

Also verwendet die

2.6-Version jetzt wieder Microtask Warum? . Weil 2.4 und frühere Versionen auch Microtask verwenden. . .

Microtask wird in einigen Fällen auch problematisch sein, da Microtask eine höhere Priorität hat und das Ereignis in der Reihenfolge der Ereignisse auftritt (z. B. #4521, # 6690) Problemumgehung) wird sogar während der Bubbling-Phase desselben Ereignisses ausgelöst (#6566).

// 核心的异步延迟函数,用于异步延迟调用 flushCallbacks 函数
let timerFunc;

// timerFunc 优先使用原生 Promise
// 原本 MutationObserver 支持更广,但在 iOS >= 9.3.3 的 UIWebView 中,触摸事件处理程序中触发会产生严重错误
if (typeof Promise !== 'undefined' && isNative(Promise)) {
  const p = Promise.resolve();
  timerFunc = () => {
    p.then(flushCallbacks);

    // IOS 的 UIWebView,Promise.then 回调被推入 microtask 队列但是队列可能不会如期执行。
    // 因此,添加一个空计时器“强制”执行 microtask 队列。
    if (isIOS) setTimeout(noop);
  };
  isUsingMicroTask = true;

  // 当原生 Promise 不可用时,timerFunc 使用原生 MutationObserver
  // 如 PhantomJS,iOS7,Android 4.4
  // issue #6466 MutationObserver 在 IE11 并不可靠,所以这里排除了 IE
} else if (
  !isIE &&
  typeof MutationObserver !== 'undefined' &&
  (isNative(MutationObserver) ||
    // PhantomJS 和 iOS 7.x
    MutationObserver.toString() === '[object MutationObserverConstructor]')
) {
  let counter = 1;
  const observer = new MutationObserver(flushCallbacks);
  const textNode = document.createTextNode(String(counter));
  observer.observe(textNode, {
    characterData: true,
  });
  timerFunc = () => {
    counter = (counter + 1) % 2;
    textNode.data = String(counter);
  };
  isUsingMicroTask = true;

  // 如果原生 setImmediate 可用,timerFunc 使用原生 setImmediate
} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
  timerFunc = () => {
    setImmediate(flushCallbacks);
  };
} else {
  // 最后的倔强,timerFunc 使用 setTimeout
  timerFunc = () => {
    setTimeout(flushCallbacks, 0);
  };
}
Nach dem Login kopieren
Zusammenfassung der Prioritäten in einem Satz:

Mikrotask-Priorität.
Promise > MutationObserver > setTimeoutnextTick-Funktion

nextTick-Funktion. Akzeptiert zwei Parameter:

    cb callback function
  1. : ist die zu verzögernde Funktion

  2. ctx
  3. : Geben Sie an, dass

    this der cb-Callback-Funktion auf Vue-Instanzmethode

    $nextTick
  4. zeigt, und
ctx

ist auf die aktuelle Vue-Instanz eingestellt.

export function nextTick(cb?: Function, ctx?: Object) {
  let _resolve;

  // cb 回调函数会经统一处理压入 callbacks 数组
  callbacks.push(() => {
    if (cb) {
      // 给 cb 回调函数执行加上了 try-catch 错误处理
      try {
        cb.call(ctx);
      } catch (e) {
        handleError(e, ctx, 'nextTick');
      }
    } else if (_resolve) {
      _resolve(ctx);
    }
  });

  // 执行异步延迟函数 timerFunc
  if (!pending) {
    pending = true;
    timerFunc();
  }

  // 当 nextTick 没有传入函数参数的时候,返回一个 Promise 化的调用
  if (!cb && typeof Promise !== 'undefined') {
    return new Promise(resolve => {
      _resolve = resolve;
    });
  }
}
Nach dem Login kopieren
Zusammenfassung

Als Ganzes betrachtet fühlt es sich relativ leicht zu verstehen an~ 2.6 Die Version ist etwas einfacher als zuvor.

Zusammenfassend lässt sich sagen, was jedes Mal getan wird, wenn aufgerufen wird:

cb-Funktion

wird verarbeitet und in das Vue.nextTick(cb)Callbacks-Array
verschoben, und das timerFunc-Funktion wird ausgeführt , verzögert den Aufruf der flushCallbacks-Funktion und durchläuft alle Funktionen im Callbacks-Array und führt sie aus. Die Priorität verzögerter Anrufe ist wie folgt: Promise

>

setImmediate
> 🎜>VersionsunterschiedeTatsächlich sind die nextTick-Strategien der

Vue 2.4, 2.5, 2.6

-Versionen geringfügig anders. Insgesamt sind

2,6

und 2,4 relativ ähnlich. (Schauen Sie genauer hin, es ist im Grunde dasselbe. 2.6 timerFunc verfügt über ein zusätzliches SetImmediate-Urteil)

2.5 Die Version ist tatsächlich ähnlich. . . Der Quellcode ist etwas anders geschrieben: Promise > MessageChannel > Das Update wird im v-on-Ereignishandler ausgelöst. NextTick verwendet zuerst die Makrotask.

Das obige ist der detaillierte Inhalt vonAnalyse der nextTick-Methode in Vue2.6. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So implementieren Sie ein Online-Spracherkennungssystem mit WebSocket und JavaScript So implementieren Sie ein Online-Spracherkennungssystem mit WebSocket und JavaScript Dec 17, 2023 pm 02:54 PM

So implementieren Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem. Einführung: Mit der kontinuierlichen Weiterentwicklung der Technologie ist die Spracherkennungstechnologie zu einem wichtigen Bestandteil des Bereichs der künstlichen Intelligenz geworden. Das auf WebSocket und JavaScript basierende Online-Spracherkennungssystem zeichnet sich durch geringe Latenz, Echtzeit und plattformübergreifende Eigenschaften aus und hat sich zu einer weit verbreiteten Lösung entwickelt. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem implementieren.

WebSocket und JavaScript: Schlüsseltechnologien zur Implementierung von Echtzeitüberwachungssystemen WebSocket und JavaScript: Schlüsseltechnologien zur Implementierung von Echtzeitüberwachungssystemen Dec 17, 2023 pm 05:30 PM

WebSocket und JavaScript: Schlüsseltechnologien zur Realisierung von Echtzeit-Überwachungssystemen Einführung: Mit der rasanten Entwicklung der Internet-Technologie wurden Echtzeit-Überwachungssysteme in verschiedenen Bereichen weit verbreitet eingesetzt. Eine der Schlüsseltechnologien zur Erzielung einer Echtzeitüberwachung ist die Kombination von WebSocket und JavaScript. In diesem Artikel wird die Anwendung von WebSocket und JavaScript in Echtzeitüberwachungssystemen vorgestellt, Codebeispiele gegeben und deren Implementierungsprinzipien ausführlich erläutert. 1. WebSocket-Technologie

So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript Dec 17, 2023 am 09:39 AM

So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript. Im heutigen digitalen Zeitalter müssen immer mehr Unternehmen und Dienste Online-Reservierungsfunktionen bereitstellen. Es ist von entscheidender Bedeutung, ein effizientes Online-Reservierungssystem in Echtzeit zu implementieren. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Reservierungssystem implementieren, und es werden spezifische Codebeispiele bereitgestellt. 1. Was ist WebSocket? WebSocket ist eine Vollduplex-Methode für eine einzelne TCP-Verbindung.

Verwendung von JavaScript und WebSocket zur Implementierung eines Echtzeit-Online-Bestellsystems Verwendung von JavaScript und WebSocket zur Implementierung eines Echtzeit-Online-Bestellsystems Dec 17, 2023 pm 12:09 PM

Einführung in die Verwendung von JavaScript und WebSocket zur Implementierung eines Online-Bestellsystems in Echtzeit: Mit der Popularität des Internets und dem Fortschritt der Technologie haben immer mehr Restaurants damit begonnen, Online-Bestelldienste anzubieten. Um ein Echtzeit-Online-Bestellsystem zu implementieren, können wir JavaScript und WebSocket-Technologie verwenden. WebSocket ist ein Vollduplex-Kommunikationsprotokoll, das auf dem TCP-Protokoll basiert und eine bidirektionale Kommunikation zwischen Client und Server in Echtzeit realisieren kann. Im Echtzeit-Online-Bestellsystem, wenn der Benutzer Gerichte auswählt und eine Bestellung aufgibt

JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems Dec 17, 2023 pm 05:13 PM

JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems Einführung: Heutzutage ist die Genauigkeit von Wettervorhersagen für das tägliche Leben und die Entscheidungsfindung von großer Bedeutung. Mit der Weiterentwicklung der Technologie können wir genauere und zuverlässigere Wettervorhersagen liefern, indem wir Wetterdaten in Echtzeit erhalten. In diesem Artikel erfahren Sie, wie Sie mit JavaScript und WebSocket-Technologie ein effizientes Echtzeit-Wettervorhersagesystem aufbauen. In diesem Artikel wird der Implementierungsprozess anhand spezifischer Codebeispiele demonstriert. Wir

Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Jan 05, 2024 pm 06:08 PM

JavaScript-Tutorial: So erhalten Sie HTTP-Statuscode. Es sind spezifische Codebeispiele erforderlich. Vorwort: Bei der Webentwicklung ist häufig die Dateninteraktion mit dem Server erforderlich. Bei der Kommunikation mit dem Server müssen wir häufig den zurückgegebenen HTTP-Statuscode abrufen, um festzustellen, ob der Vorgang erfolgreich ist, und die entsprechende Verarbeitung basierend auf verschiedenen Statuscodes durchführen. In diesem Artikel erfahren Sie, wie Sie mit JavaScript HTTP-Statuscodes abrufen und einige praktische Codebeispiele bereitstellen. Verwenden von XMLHttpRequest

So verwenden Sie insertBefore in Javascript So verwenden Sie insertBefore in Javascript Nov 24, 2023 am 11:56 AM

Verwendung: In JavaScript wird die Methode insertBefore() verwendet, um einen neuen Knoten in den DOM-Baum einzufügen. Diese Methode erfordert zwei Parameter: den neuen Knoten, der eingefügt werden soll, und den Referenzknoten (d. h. den Knoten, an dem der neue Knoten eingefügt wird).

So erhalten Sie auf einfache Weise HTTP-Statuscode in JavaScript So erhalten Sie auf einfache Weise HTTP-Statuscode in JavaScript Jan 05, 2024 pm 01:37 PM

Einführung in die Methode zum Abrufen des HTTP-Statuscodes in JavaScript: Bei der Front-End-Entwicklung müssen wir uns häufig mit der Interaktion mit der Back-End-Schnittstelle befassen, und der HTTP-Statuscode ist ein sehr wichtiger Teil davon. Das Verstehen und Abrufen von HTTP-Statuscodes hilft uns, die von der Schnittstelle zurückgegebenen Daten besser zu verarbeiten. In diesem Artikel wird erläutert, wie Sie mithilfe von JavaScript HTTP-Statuscodes erhalten, und es werden spezifische Codebeispiele bereitgestellt. 1. Was ist ein HTTP-Statuscode? HTTP-Statuscode bedeutet, dass der Dienst den Dienst anfordert, wenn er eine Anfrage an den Server initiiert

See all articles