Lernen Sie nextTick in 10 Minuten kennen und implementieren Sie eine einfache Version von nextTick

In Vue.js gibt es eine spezielle Methode nextTick, die nach der Aktualisierung des DOM einen Codeabschnitt ausführt, um auf den Abschluss der DOM-Zeichnung zu warten. In diesem Artikel werden das Prinzip und die Verwendung von ausführlich vorgestellt nextTickund eine einfache Version implementiert, nextTickum Ihr Verständnis zu vertiefen.

1. Was istnextTick

Einfach ausgedrückt nextTickhandelt es sich bei der Methode um einen gängigen Mechanismus zum asynchronen Aktualisieren des DOM in Vue.js. Sein Prinzip besteht darin, den Ereignisschleifenmechanismus von JavaScript und den Rendering-Prozess des Browsers zu nutzen, um die Ausführung von DOM-Aktualisierungsvorgängen zu verzögern.

Es scheint hauptsächlich die Betriebsprobleme nach der DOM-Aktualisierung zu lösen, die durch die asynchrone Aktualisierung von Vue verursacht werden.

In Vue lösen Datenänderungen ein erneutes Rendern des DOM aus, tatsächlich sind die Datenaktualisierungen von Vue jedoch asynchron. Mit anderen Worten: Wenn wir die Daten der Vue-Instanz ändern, wird das DOM nicht sofort aktualisiert, sondern in der nächsten Ereignisschleife.

Dieser asynchrone Aktualisierungsmechanismus dient der Optimierung der Leistung. Vue führt mehrere Datenänderungen zusammen und führt dann in der nächsten Ereignisschleife eine einmalige DOM-Aktualisierung durch, wodurch unnötige DOM-Vorgänge reduziert und die Leistung verbessert werden.

Aufgrund des asynchronen Aktualisierungsmechanismus müssen Sie jedoch manchmal einige DOM-Vorgänge unmittelbar nach der Änderung der Daten ausführen, z. B. das Abrufen aktualisierter DOM-Elemente, das Berechnen aktualisierter Stile, das Auslösen bestimmter Ereignisse usw. nextTickIn diesem Fall müssen Sie die Methode verwenden .

nextTickDie Methode ist ein von Vue bereitgestelltes Dienstprogramm, das die Ausführung der Rückruffunktion bis zum nächsten DOM-Aktualisierungszyklus verzögern kann. Das heißt, durch nextTickdie Methode können wir sicherstellen, dass bestimmte Aktionen ausgeführt werden, nachdem die DOM-Aktualisierung abgeschlossen ist.

nextTickDie Methode wird häufig zur Lösung folgender Probleme eingesetzt :

  • Holen Sie sich das aktualisierte DOM-Element
  • Aktualisierte Stilberechnungen
  • Lösen Sie bestimmte Ereignisse aus

Zusammenfassend lässt sich sagen, nextTickdass das Aufkommen von Vue die Betriebsprobleme nach der DOM-Aktualisierung löst, die durch den asynchronen Aktualisierungsmechanismus von Vue verursacht werden, sodass wir entsprechende Vorgänge zum richtigen Zeitpunkt ausführen und die Entwicklungseffizienz und -flexibilität verbessern können.

2. Umsetzungsprinzip

Insbesondere wenn wir nextTickdie Methode in unserem Code verwenden, schiebt das Framework die zu aktualisierenden DOM-Vorgänge in eine Warteschlange und verwendet dann Makroaufgaben oder Mikroaufgaben (je nach Framework und Browser), nachdem die aktuelle JavaScript-Aufgabe abgeschlossen ist. (Implementierung) Der Mechanismus wird ausgeführt, um sicherzustellen, dass das DOM manipuliert wird, nachdem die Ausführung der Codelogik abgeschlossen ist.

Dieses Design stellt sicher, dass das DOM erst aktualisiert wird, nachdem alle Synchronisierungsvorgänge in der aktuellen JavaScript-Laufumgebung abgeschlossen sind, um Leistungsprobleme zu vermeiden, die durch Neuanordnung oder Neuzeichnung aufgrund von DOM-Aktualisierungen verursacht werden können. Gleichzeitig kann durch die Verwendung des asynchronen Aktualisierungsmechanismus eine große Anzahl von DOM-Aktualisierungen besser verwaltet und die Rendering-Leistung optimiert werden.

Es ist zu beachten, dass nextTickdie Methode zwar normalerweise gekapselt und im Framework verwendet wird, Sie in einigen modernen Browsern jedoch auch direkt native Methoden Promiseusw. verwenden können MutationObserver, um einen ähnlichen asynchronen Aktualisierungseffekt zu erzielen. Die spezifische Implementierung kann je nach Framework und Browser variieren.

nextTickDie Methode führt eine Rückruffunktion aus, nachdem der nächste DOM-Aktualisierungszyklus endet. Auf diese Weise können wir sicherstellen, dass das DOM aktualisiert wurde, bevor DOM-Elemente manipuliert werden. Es wird durch einige asynchrone Techniken implementiert, um sicherzustellen, dass die Rückruffunktion zur Warteschlange hinzugefügt und beim nächsten Tick ausgeführt wird.

3. Nutzungsszenarien

nextTickIm Folgenden sind einige Anwendungsszenarien aufgeführt, in denen wir die Methode in der täglichen Entwicklung verwenden:

1. Bearbeiten Sie das aktualisierte DOM

Wenn Sie das aktualisierte DOM bearbeiten müssen, können Sie den DOM-Operationscode in die Rückruffunktion einschließen, wenn Sie Vue.js oder andere ähnliche Frameworks verwenden nextTick. Dadurch wird sichergestellt, dass die DOM-Aktualisierung abgeschlossen ist und der Vorgang im nächsten „DOM-Aktualisierungszyklus“ ausgeführt wird , um das Problem zu vermeiden, dass der Vorgang nicht wirksam wird.

<template>
  <div>
    <p>{
   
   { message }}</p>
    <button @click="updateMessage">更新消息</button>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        message: "原始消息",
      };
    },
    methods: {
      updateMessage() {
        this.message = "更新后的消息";

        this.$nextTick(() => {
          // 操作更新后的 DOM
          const messageElement = document.querySelector("p");
          // 输出:更新后的消息
          console.log(messageElement.textContent);
        });
      },
    },
  };
</script>

Hinweis: Der obige Code dient nur als Beispiel. Die direkte Manipulation von DOM-Elementen wird in Vue nicht empfohlen.

Wenn auf die Schaltfläche „Nachricht aktualisieren“ geklickt wird , aktualisiert updateMessagedie Methode messageden Wert von auf „Aktualisierte Nachricht“ . In $nextTickder Rückruffunktion von können wir das aktualisierte DOM-Element über den Selektor abrufen und entsprechende Vorgänge ausführen.

2. Vorgang nach asynchronem Update

Wenn Sie nach der Aktualisierung des DOM einige asynchrone Vorgänge ausführen müssen, z. B. das Senden des Formulars nach der Aktualisierung der Formulardaten, das Scrollen und Positionieren nach der Aktualisierung der Listendaten usw., können Sie nextTickden entsprechenden asynchronen Vorgang in der Rückruffunktion auslösen . Dies garantiert, dass der Vorgang im nächsten Ereignisschleifenzyklus ausgeführt wird, um sicherzustellen, dass die Aktualisierung abgeschlossen wurde.

<template>
  <div>
    <ul>
      <li v-for="item in items" :key="item.id">{
   
   { item.name }}</li>
    </ul>
    <button @click="updateItems">更新列表</button>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        items: [
          { id: 1, name: "Item 1" },
          { id: 2, name: "Item 2" },
          { id: 3, name: "Item 3" },
        ],
      };
    },
    methods: {
      updateItems() {
        // 异步更新数据
        setTimeout(() => {
          this.items.push({ id: 4, name: "Item 4" });
          this.$nextTick(() => {
            // 在更新后的 DOM 中进行滚动定位
            const lastItem = document.querySelector("li:last-child");
            lastItem.scrollIntoView({ behavior: "smooth" });
          });
        }, 1000);
      },
    },
  };
</script>

Wenn auf die Schaltfläche „Liste aktualisieren“ geklickt wird , fügt die Methode über einen asynchronen Vorgang ein neues Element updateItemszum Array hinzu. itemsIn $nextTickder Callback-Funktion von können wir nach der Aktualisierung des DOM das letzte Element in den sichtbaren Bereich scrollen.

Anhand der beiden oben genannten Beispiele können wir nextTickdie Anwendungsszenarien von sehen. Der Schlüssel besteht darin, den Code, der nach der Aktualisierung des DOM ausgeführt werden muss, in nextTickdie Rückruffunktion von einzufügen, um sicherzustellen, dass die Aktualisierung abgeschlossen wurde. Gleichzeitig können asynchrone Vorgänge kombiniert werden, um das Benutzererlebnis oder die Leistung zu optimieren.

4. So implementieren Sie eine einfache VersionnextTick

Wenn wir selbst eine ähnliche Methode in Vue implementieren $nextTick, können wir über die Verwendung von JavaScripts nachdenken Promiseund MutationObserverderen Verhalten simulieren. Schauen wir uns das im Detail an:

// 自定义的 $nextTick 方法
Vue.prototype.$myNextTick = function () {
    
    
  return new Promise((resolve) => {
    
    
    if (typeof MutationObserver !== "undefined") {
    
    
      // 使用 MutationObserver 监听 DOM 变化
      let observer = new MutationObserver(resolve);
      let textNode = document.createTextNode("1");
      observer.observe(textNode, {
    
    
        characterData: true,
      });
      textNode.textContent = "2";
    } else {
    
    
      // fallback 方案,使用 setTimeout 模拟异步
      setTimeout(resolve, 0);
    }
  });
};
  1. Zuerst Vue.prototypefügen wir eine $myNextTickMethode namens on hinzu. Indem prototypewir diese Methode dem Objekt hinzufügen, können wir die Methode auf der Instanz von Vue verwenden $myNextTick.
  2. Vue.prototype.$myNextTickInnerhalb der Methode wird ein Objekt zurückgegeben Promise. Indem wir Promiseein Objekt zurückgeben, können wir .thendie oder- async/awaitSyntax verwenden, um Promisedas Parsen von durchzuführen.
  3. In der Promise-Rückruffunktion der Methode prüfen wir zunächst, ob die aktuelle Umgebung dies unterstützt MutationObserver. MutationObserverEs handelt sich um eine API zur asynchronen Überwachung von DOM-Änderungen.
  4. Wenn die aktuelle Umgebung dies unterstützt MutationObserver, erstellen wir eine MutationObserverInstanz und setzen ihre Rückruffunktion auf resolve. Wir erstellen einen Textknoten, fügen ihn dem DOM hinzu und lösen dann DOM-Änderungen aus, indem wir den Inhalt des Textknotens ändern. Wenn sich das DOM ändert, wird MutationObserverdie Rückruffunktion aufgerufen.resolve
  5. Wenn die aktuelle Umgebung dies nicht unterstützt MutationObserver, werden wir setTimeoutasynchrone Vorgänge simulieren. resolveWir verwenden eine Verzögerung von 0 Millisekunden, um die Ausführung in der nächsten Ereignisschleife sicherzustellen und so den Effekt von Asynchronität zu simulieren.

Nachdem wir die einfache Version fertiggestellt haben $nextTick, werfen wir einen Blick auf die Verwendung $myNextTick:

// 示例组件
new Vue({
    
    
  el: "#app",
  data() {
    
    
    return {
    
    
      message: "Hello, Vue!",
    };
  },
  methods: {
    
    
    updateMessage() {
    
    
      this.message = "Updated Message";

      this.$myNextTick().then(() => {
    
    
        console.log("DOM 已更新");
        // 在 DOM 更新后进行其他操作
      });
    },
  },
});

In diesem Beispiel wird beim Klicken auf die Schaltfläche updateMessagedie Methode aufgerufen, die messageden Wert auf „Updated Message“ aktualisiert . Verwenden Sie dann das $myNextTickvon der Methode zurückgegebene Objekt Promise, um sicherzustellen, dass andere Vorgänge ausgeführt werden, bevor das DOM aktualisiert wird.

Durch diese Implementierung können wir $myNextTickdie Methode in der Vue-Komponente verwenden, um Vorgänge nach der Aktualisierung des DOM auszuführen, ähnlich wie die native $nextTickMethode von Vue.

Beachten Sie, dass es sich lediglich um eine Simulationsimplementierung handelt und ihr Zweck darin besteht, $nextTickdas Verständnis der Vue-Version zu vertiefen. Der Code reproduziert möglicherweise nicht vollständig das Verhalten der nativen Version von Vue $nextTick. Daher wird in der tatsächlichen Entwicklung empfohlen, die von Vue bereitgestellten integrierten $nextTickMethoden zu verwenden, um genauere und zuverlässigere Post-DOM-Aktualisierungsvorgänge sicherzustellen.

5. Vorsichtsmaßnahmen

Bei der Anwendung nextTickder Methode müssen Sie auf folgende Punkte achten:

  • nextTickDie Methode ist eine Instanzmethode, die direkt in der Vue-Komponente verwendet werden kann, aber an anderer Stelle über die Vue-Instanz aufgerufen werden muss, zum Beispiel:this.$nextTick()
  • nextTickDie Methode ist asynchron und die Rückruffunktion wird nach dem Ende des nächsten DOM-Aktualisierungszyklus ausgeführt, sodass sie nicht sofort ausgeführt wird.
  • nextTickMethoden unterstützen die Verkettung von Aufrufen mit Promise oder Funktionen, die Promise zurückgeben.

Ich denke du magst

Origin blog.csdn.net/dfc_dfc/article/details/135172468
Empfohlen
Rangfolge