Detaillierte Erklärung des Hash-Jump-Prinzips von Vue

Detaillierte Erklärung des Hash-Jump-Prinzips von Vue

Im neuen vueRouter können wir ein Modusattribut übergeben, das drei Werte erhalten kann: Hash/History/Abstract

Der Unterschied zwischen Hash und Verlauf

Der Verlaufspfad ist schöner, z. B. http://yoursite.com/user/id. Der Verlauf basiert auf pushState(), um URL-Sprünge abzuschließen, ohne die Seite neu zu laden. Allerdings verursacht die erzwungene Aktualisierung weiterhin Probleme (der Server löst dieses Problem), sodass für den Verlaufsmodus die Zusammenarbeit des Backend-Personals erforderlich ist.

Der Hash-Pfad enthält ein #, z. B. http://yoursite.com#/user/id

HashHistorie

Klasse VueRouter{
 Konstruktor(Optionen){
  this.matcher = createMatcher(Optionen.Routen || []);
//Um hier den Hash-Modus zu erklären, werden wir nicht beurteilen, welchen Modus der Benutzer übergeben hat this.history = new HashHistory(this); //diese Vue-Router-Instanz}
}

Der Quellcode erstellt hier eine Basisklasse. Diese vereinheitlichen wir mit dem Quellcode. Diese Basisklasse kapselt die gemeinsamen Methoden und Eigenschaften der drei Modi. Anschließend erstellen wir hier eine HashHistory und eine Basisklasse History.

Verlauf aus „./base“ importieren
// Hash-Routing exportiert Standardklasse HashHistory erweitert History{
 Konstruktor(Router){
  super(router); //Erben und Aufrufen der übergeordneten Klasse ist gleich Aufruf
 }
}
// Basisklasse für Routing-Export Standardklasse History {
 Konstruktor(Router){
  dieser.router = router;
 }
}

Wenn es sich um eine Hash-Route handelt und beim Öffnen der Website kein Hash vorhanden ist, sollte standardmäßig #/ hinzugefügt werden

Verlauf aus „./base“ importieren;
Funktion EnsureSlash(){ 
 wenn(Fenster.Standort.Hash){
  zurückkehren 
 }
 fenster.standort.hash = "/"
}
exportiere Standardklasse HashHistory erweitert History{
 Konstruktor(Router){
  super(Router);
  EnsureSlash(); // Stelle sicher, dass ein Hash vorhanden ist
 }
}

Werfen wir einen Blick auf die Initialisierungslogik (router.init-Funktion oben)

init(app){
  const Verlauf = diese.Geschichte;
  // Beim Initialisieren sollten Sie zuerst den aktuellen Pfad abrufen und eine Matching-Logik ausführen. // Lassen Sie das Routing-System zu einem bestimmten Pfad wechseln. const setupHashListener = ()=> {
   history.setupListener(); // Auf Pfadänderungen achten}
  history.transitionTo( // Die übergeordnete Klasse stellt eine Methode bereit, die für das Springen zuständig ist history.getCurrentLocation(), // Die untergeordnete Klasse erhält den entsprechenden Pfad // Nachdem der Sprung erfolgreich war, registrieren Sie den Pfad-Listener, um sich auf die Ansichtsaktualisierung vorzubereiten setupHashListener
  )
}

Hier müssen wir jeweils transitionTo (Basisklassenmethode), getCurrentLocation und setupListener implementieren.

getCurrentLocation-Implementierung

Funktion getHash(){
 gibt window.location.hash.slice(1) zurück;
}
exportiere Standardklasse HashHistory erweitert History{
 // ...
 getAktuellerStandort(){
  gibt getHash() zurück;
 }
}

setupListener-Implementierung

exportiere Standardklasse HashHistory erweitert History{
 // ...
 setupListener(){
  window.addEventListener('hashchange', ()=> {
   // Übergang zum entsprechenden Pfad gemäß dem aktuellen Hash-Wert this.transitionTo(getHash());
  })
 }
}

Übergang zur Implementierung

Exportfunktion createRoute(Datensatz, Standort) { // {Pfad:'/',übereinstimmend:[Datensatz,Datensatz]}
 lass res = [];
 if (Datensatz) { // Wenn ein Datensatz vorhanden ist while (Datensatz) {
   res.unshift(Datensatz); // setze den übergeordneten Datensatz des aktuellen Datensatzes an den Anfang Datensatz = Datensatz.übergeordnet
  }
 }
 zurückkehren {
  ...Standort,
  Übereinstimmung: res
 }
}
exportiere Standardklasse Verlauf {
 Konstruktor(Router) {
  dieser.router = router;
  //Gibt das Objekt basierend auf dem Datensatz und dem Pfad zurück, das später für das Router-View-Matching verwendet wird this.current = createRoute(null, {
   Weg: '/'
  })
 }
 // Kernlogik transitionTo(location, onComplete) {
  // Um ​​den Pfad abzugleichen, let route = this.router.match(location);
  // Derselbe Pfad muss nicht gewechselt werden, wenn(
   Standort === Route.Pfad && 
   route.übereinstimmende.Länge === diese.aktuelle.übereinstimmende.Länge){
   zurückkehren 
  }
  //Aktualisieren Sie die Route und ändern Sie das _route-Attribut der Stamminstanz wie unten beschrieben this.updateRoute(route)
  beiAbgeschlossen und beiAbgeschlossen();
 }
}
exportiere Standardklasse VueRouter{
 // ...
 //Erstellen Sie eine Proxy-Übereinstimmung (Standort){
  gib this.matcher.match(Standort) zurück;
 }
}

Macth-Methode

function match(location){ // Später den entsprechenden Datensatz basierend auf dem Pfad finden let record = pathMap[location]
 if (record) { // Erstelle die entsprechende Route entsprechend dem Datensatz //Parameter: /about/a:{path:xx,component...},path:'/about/a'
  returniere Route erstellen(Datensatz,{
   Pfad:Standort
  })
 }
 // Wenn keine Übereinstimmung gefunden wird, gib eine leere Übereinstimmung zurück return createRoute(null, {
  Pfad: Standort
 })
}

Es ist nicht schwer zu erkennen, dass die aktuelle Eigenschaft geändert wird, wenn sich der Pfad ändert. Wir können die aktuelle Eigenschaft reaktionsfähig machen und die Ansicht jedes Mal aktualisieren, wenn sich die aktuelle Eigenschaft in der Installationsmethode ändert.

installieren(Vue) {
 Vue.mixin({ // Füge die Methode beforeCreate zum Lebenszyklus aller Komponenten hinzu beforeCreate() {
   wenn (diese.$options.router) { 
   //Rufen Sie die bidirektionale Datenbindungsmethode in der Vue-Klasse auf Vue.util.defineReactive(this,'_route',this._router.history.current);
   } 
  }
 });
 // Die Methoden $route und $router sind die gebräuchlichsten Proxys in Vue. Sie dienen lediglich der Benutzerfreundlichkeit. Object.defineProperty(Vue.prototype,'$route',{ // Jede Instanz kann die Eigenschaft $route abrufen get(){
   return this._routerRoot._route; //Bidirektionale Datenbindung, die gerade oben durchgeführt wurde}
 });
 Object.defineProperty(Vue.prototype,'$router',{ // Jede Instanz kann den Router abrufen instanceget(){
   gib dies zurück._routerRoot._router;
  }
 })
 }

Die Update-Methode _route muss jedes Mal aufgerufen werden, wenn die Switch-Route initialisiert wird, da _route während der Installation bidirektional an Daten gebunden ist und this._router.history.current beim ersten Eintreffen nicht vorhanden ist. Abonnement- und Aktualisierungsvorgänge werden über die Publish-Subscribe-Methode ausgeführt. Fügen Sie der Init-Methode eine Abhörfunktion hinzu

history.listen((route) => { // Muss das Attribut _route aktualisieren, eine Funktion aufrufen und beenden app._route = route
});
exportiere Standardklasse Verlauf {
 Konstruktor(Router) {
  // ...
  dies.cb = null;
 }
 hören(cb){
  this.cb = cb; //Funktion registrieren}
 updateRoute(route){
  dies.aktuell =Route;
  this.cb && this.cb(route); // Aktualisiere die Eigenschaft _route, nachdem du die aktuelle aktualisiert hast}
}

Oben finden Sie eine ausführliche Erläuterung des Hash-Jump-Prinzips von Vue. Weitere Informationen zum Hash-Jump-Prinzip von Vue finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Vue-Element-Admin integriert eine eigene Schnittstelle, um den Login-Sprung zu realisieren
  • Implementierung der Parametersprungfunktion im Vue-Projekt
  • So implementieren Sie Vue Page Jump
  • Vue implementiert Login, Registrierung, Beenden, Springen und andere Funktionen
  • Das Routing in Vue wird nicht in Verlaufsvorgängen gezählt.
  • So leiten Sie eine PC-Adresse in Vue an eine Mobiladresse um

<<:  Lösung für den MySQL-Dienstfehler 1067: Ändern Sie den Pfad der ausführbaren MySQL-Datei

>>:  So stellen Sie eine Nextcloud-Netzwerkfestplatte mit Docker bereit

Artikel empfehlen

JavaScript-Flusskontrolle (Verzweigung)

Inhaltsverzeichnis 1. Prozesskontrolle 2. Sequent...

So stellen Sie ein SpringBoot-Projekt mit Dockerfile bereit

1. Erstellen Sie ein SpringBoot-Projekt und packe...

Vor- und Nachteile von React Hooks

Inhaltsverzeichnis Vorwort Vorteil: Mangel: 1. Re...

...

Einführung in die Verschlüsselung des Grub-Boot-Programms in Linux

Inhaltsverzeichnis 1. Was ist Grub-Verschlüsselun...

Zusammenfassung der Docker-Datenspeicherung

Bevor Sie diesen Artikel lesen, hoffe ich, dass S...

Detaillierte Schritte zur Installation und Verwendung von VMware ESXi 6.5

Inhaltsverzeichnis Einführung Architektur Vorteil...

Docker stop stoppt/remove löscht alle Container

In diesem Artikel wird hauptsächlich das Stoppen/...

Die Verknüpfungsmethode zwischen Menü und Registerkarte von vue+iview

Vue+iview-Menü und Tab-Verknüpfung Ich entwickle ...

So geben Sie Parametervariablen extern im Docker an

In diesem Artikel wird hauptsächlich erläutert, w...