Detaillierte Erläuterung der Selbstimplementierung von Dispatch und Broadcast (Dispatch und Broadcast) durch Vue

Detaillierte Erläuterung der Selbstimplementierung von Dispatch und Broadcast (Dispatch und Broadcast) durch Vue

Zu lösendes Problem

Hauptsächlich für die ebenenübergreifende Kommunikation zwischen Komponenten

Warum müssen Sie Dispatch und Broadcast selbst implementieren?

Denn bei der Entwicklung unabhängiger Komponenten oder Bibliotheken ist es am besten, sich nicht auf Bibliotheken von Drittanbietern zu verlassen

Warum nicht „Provide“ und „Inject“ verwenden?

Da das Verwendungsszenario hauptsächlich darin besteht, dass untergeordnete Komponenten den Status übergeordneter Komponenten erhalten, wird zwischen ebenenübergreifenden Komponenten eine aktive Bereitstellungs- und Abhängigkeitsinjektionsbeziehung hergestellt.
Dann gibt es zwei Szenarien, die es nicht gut lösen kann:
Die übergeordnete Komponente übergibt Daten an die untergeordnete Komponente (unterstützt ebenenübergreifend).
Die untergeordnete Komponente übergibt Daten an die übergeordnete Komponente (unterstützt ebenenübergreifend).

Der Code lautet wie folgt:

emitter.js

Funktion Broadcast (Komponentenname, Ereignisname, Parameter) {
 dies.$children.forEach(child => {
  const name = untergeordnetes Element.$Optionen.name;

  wenn (Name === Komponentenname) {
   Kind.$emit.apply(Kind, [Ereignisname].concat(Parameter));
  } anders {
   // todo Wenn params ein leeres Array ist, erhält es undefined
   broadcast.apply(Kind, [Komponentenname, Ereignisname].concat([Parameter]));
  }
 });
}
Standard exportieren {
 Methoden: {
  dispatch(Komponentenname, Ereignisname, Parameter) {
   lass übergeordnetes Element = dies.$übergeordnetes Element || dies.$wurzel;
   lass name = übergeordnetes Element.$options.name;

   während (übergeordnetes Element && (!name || name !== Komponentenname)) {
    Elternteil = Elternteil.$Elternteil;

    wenn (Elternteil) {
     Name = übergeordnetes Element.$Optionen.Name;
    }
   }
   wenn (Elternteil) {
    übergeordnetes Element.$emit.apply(übergeordnetes Element, [Ereignisname].concat(Parameter));
   }
  },
  Broadcast(Komponentenname, Ereignisname, Parameter) {
   broadcast.call(dies, Komponentenname, Ereignisname, Parameter);
  }
 }
};

übergeordnetes Element

<Vorlage>
 <div>
  <h1>Ich bin die übergeordnete Komponente</h1>
  <button @click="handleClick">Ereignis auslösen</button> <child />
 </div>
</Vorlage>
<Skript>
importiere Emitter aus "@/mixins/emitter.js";
importiere Kind aus "./child";
Standard exportieren {
 Name: "KomponenteA",
 Mixins: [Emitter],
 erstellt() {
  dies.$on("Kind-zu-p", dies.handleChild);
 },
 Methoden: {
  handleKlick() {
   this.broadcast("KomponenteB", "On-Message", "Hallo Vue.js");
  },
  handleChild(Wert) {
   Alarm(Wert);
  }
 },
 Komponenten:
  Kind
 }
};
</Skript>

Kind.vue

<Vorlage>
 <div>Ich bin eine untergeordnete Komponente</div>
</Vorlage>
<Skript>
importiere Emitter aus "@/mixins/emitter.js";
Standard exportieren {
 Name: "KomponenteB",
 Mixins: [Emitter],
 erstellt() {
  dies.$on("on-message", dies.showMessage);
  this.dispatch("KomponenteA", "Kind-zu-P", "Hallo Elternteil");
 },
 Methoden: {
  Nachricht anzeigen(Text) {
   Fenster.Alarm(Text);
  }
 }
};
</Skript>

Auf diese Weise kann eine benutzerdefinierte Kommunikation zwischen Komponenten auf verschiedenen Ebenen erreicht werden. Dabei ist jedoch ein Problem zu beachten: Das Abonnement muss vor der Veröffentlichung erfolgen, d. h. „on“ muss vor „emit“ kommen.

Renderreihenfolge für übergeordnete und untergeordnete Komponenten, Reihenfolge der Instanzerstellung

Die untergeordnete Komponente wird vor der übergeordneten Komponente gerendert. Wenn also das Mount-Ereignis der untergeordneten Komponente ausgelöst wird, ist es beim Mounten in der übergeordneten Komponente nicht zu hören.
Die Erstellung der übergeordneten Komponente geht der untergeordneten Komponente voraus, sodass die Erstellung in der übergeordneten Komponente überwacht werden kann

Dies ist das Ende dieses Artikels über Vues selbst implementiertes Dispatch und Broadcast (Dispatch und Broadcast). Weitere relevante Inhalte zu Vue Dispatch und Broadcast finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Praxis zur Optimierung des ersten Bildschirms einer Vue SPA-Einzelseitenanwendung
  • Vue-Implementierungsbeispiel für Broadcast und Dispatch
  • Vorab-Rendering einzelner Seiten über Vue-CLI, SEO-Prerender-Spa-Plugin-Vorgang
  • Verwendung von store.commit und store.dispatch in vuex
  • Vue SPA gibt zuerst den Implementierungscode für die Ladeanimation ein
  • Vue realisiert den Effekt des Zusammenführens von Spalten im Zeilenbereich einer Datentabelle
  • Routing-Caching-Probleme und -Lösungen in Vue SPA-Anwendungen
  • Lösen Sie das Problem, dass Vuex's Dispatch unter Vue+Electron keine Wirkung hat
  • VUE löst das Problem der WeChat-Signatur und der ungültigen SPA-WeChat-Signatur (perfekte Verarbeitung)
  • Detaillierte Erklärung, wann die Aktion in Vuex abgeschlossen ist und wie Dispatch korrekt aufgerufen wird
  • Vue SPA-Lösung zur Optimierung des ersten Bildschirms

<<:  So ändern Sie das Root-Passwort in MySQL 5.7

>>:  So implementieren Sie eine automatische Remote-Sicherung von MongoDB unter Linux

Artikel empfehlen

So richten Sie einen FTP-Server in CentOS7 ein

FTP wird hauptsächlich für die Dateiübertragung v...

Tabellen in HTML aufteilen und zusammenführen (colspan, rowspan)

Der Code demonstriert die horizontale Zusammenfüh...

Sieben Prinzipien eines guten Designers (1): Schriftdesign

Nun, vielleicht sind Sie ein Design-Guru, oder vie...

Auszeichnungssprachen – Was lernen, nachdem man HTML gelernt hat?

Klicken Sie hier, um zum Abschnitt „HTML-Tutorial“...

Lösung für leere Seite nach Vue-Verpackung

1. Lösung für das Problem, dass die Seite leer is...

Der Unterschied zwischen Schlüssel und Index in MySQL

Schauen wir uns zunächst den Code an: ALTER TABLE...

Einige Schlussfolgerungen zur Entwicklung mobiler Websites

Die mobile Version der Website sollte zumindest ü...

Web-Frontend-Entwicklung CSS-bezogene Teamzusammenarbeit

Die Frontend-Entwicklungsabteilung wächst, die Mi...

Lösung für Docker-Container, der Schriftarten wie Songti nicht erkennt

Problemhintergrund: Wenn Sie Docker zum Bereitste...

Detaillierte Diskussion der InnoDB-Sperren (Record-, Gap-, Next-Key-Sperre)

Die Datensatzsperre sperrt einen einzelnen Indexd...