Vue Router lädt verschiedene Komponenten je nach Hintergrunddaten

Vue Router lädt verschiedene Komponenten je nach Hintergrunddaten

Anforderungen aus der Projektpraxis

Derselbe Link muss verschiedene Seitenkomponenten laden. Abhängig von den vom Benutzer erworbenen Diensten werden unterschiedliche Seiten angezeigt.

Es gibt einige schlechte Implementierungen

  • Schreiben Sie diese Komponenten einfach unter dieselbe Komponente und beurteilen Sie sie durch v-if. Wenn Sie dies tun, müssen Sie nicht einmal vue-router verwenden. Sie können einfach alle Komponenten in eine Datei schreiben und v-if verwenden, um sie alle zu beurteilen. (Die Prämisse ist, dass es sich um Zehntausende von Codezeilen handelt, wenn Ihnen der Aufwand nichts ausmacht.)
  • Fordern Sie beim Rendern dieses Links direkt die Hintergrunddaten an und rendern Sie basierend auf den Daten unterschiedliche Links. (Theoretisch ist dies möglich, aber wenn der Benutzer diese Funktion nicht verwendet, werden bei diesen Links jedes Mal im Voraus Hintergrunddaten abgerufen. Darüber hinaus ist, wenn der Benutzer den Link kennt und direkt auf den Link zugreift, immer noch eine Logik erforderlich, um zu bestimmen, welche Seite dem Benutzer angezeigt werden soll.)
  • Durch den Aufruf von router.beforeEach wird jede Route abgefangen. Wenn die Route die von uns angegebene Route ist, werden die Hintergrunddaten angefordert und die Seite dynamisch gesprungen. (Die Funktion kann abgeschlossen werden, aber tatsächlich ist dies nur ein kleiner Teil des gesamten Systems und sollte nicht in das gesamte Routing-System eindringen. Wenn jede Geschäftsseite im globalen Routing-System geschrieben wird, führt dies auch dazu, dass die Routing-Logik zu kompliziert wird.)

Ich persönlich bin der Meinung, dass der bessere Weg zur Umsetzung

Abrufen der Serverdaten, auf denen die Route konfiguriert ist, und dynamisches Laden der entsprechenden Komponenten

{
  Pfad: 'shopKPI',
  // Wenn Sie die Hintergrunddaten vorab im Store speichern, können Sie sie direkt beurteilen, indem Sie hier auf die Store-Daten zugreifen. // Die Daten dieser spezifischen Unternehmensseite werden jedoch im globalen Store abgelegt und nirgendwo anders verwendet. Sie sind daher wirklich unnötig. Komponente: () => import('@/views/store/dataVersion'),
  Name: 'store_KPI',
  menuName: 'Shop-Berater',
  Meta: {
    Codes: ['storeProduct.detail']
  }
}

Das Ideal ist schön, aber die Realität sieht so aus, dass die von der Komponente empfangene Methode synchron ein Versprechen zurückgeben muss.

Zu diesem Zeitpunkt dachte ich an die schlechte Implementierungsmethode 1 oben und änderte sie leicht.

<!-- ChooseShopKPI.vue -->
<Vorlage>
  <dataVersion v-if="!useNewShopKPI" />
  <ShopKPI v-else />
</Vorlage>

<Skript>
importiere { get } von 'lodash';
importiere { getStoreReportFormVersion } von '@/api/store';
importiere dataVersion aus „./dataVersion“;
importiere ShopKPI aus „./ShopKPI“;

Standard exportieren {
  Name: 'ChooseShopKPI',

  Komponenten:
    Datenversion,
    ShopKPI,
  },

  Daten() {
    return { useNewShopKPI: false };
  },

  erstellt() {
    getStoreReportFormVersion().then((res) => {
      wenn (get(res, 'data.data.new')) {
        this.useNewShopKPI = wahr;
      }
    });
  },
};
</Skript>

<style lang="css" scoped></style>

Ändern Sie die Seite, die der Routendarstellung entspricht, um diese Zwischenseite ChooseShopKPI darzustellen

{
  Pfad: 'shopKPI',
  // Wenn Sie die Hintergrunddaten im Voraus erhalten, können Sie sie direkt beurteilen, indem Sie hier auf die Store-Daten zugreifen. // Die Daten dieser bestimmten Geschäftsseite werden jedoch im globalen Store abgelegt und nirgendwo anders verwendet. Daher sind sie wirklich nicht erforderlich. - Komponente: () => import('@/views/store/dataVersion'),
+ Komponente: () => import('@/views/store/ChooseShopKPI'),
  Name: 'store_KPI',
  menuName: 'Shop-Berater',
  Meta: {
    Codes: ['storeProduct.detail']
  }
}

Dadurch wird die erwartete Funktionalität erreicht.

Die Funktion wurde realisiert, aber ich habe wieder angefangen, darüber nachzudenken

Allerdings löst diese Methode das Problem des dynamischen Ladens von Seitenkomponenten sehr gut. Es traten jedoch auch einige kleinere Probleme auf.

  • Wenn später weitere Seiten hinzugefügt werden, die Daten über den Server laden, werden mehrere ChooseXXX-Zwischenseiten angezeigt.
  • Diese Art von Zwischenseite führt tatsächlich eine sekundäre Weiterleitung durch. Entwickler, die mit der Logik nicht vertraut sind, verstehen die Seitensprunglogik hier möglicherweise nicht, was den Verständnisaufwand erhöht.

Die endgültige Lösung - High-Level-Komponenten

Durch Abstrahieren von ChooseXXX wird es in DynamicLoadComponent umgewandelt

<!-- DynamicLoadComponent.vue -->
<Vorlage>
  <Komponente: ist = "comp" />
</Vorlage>

<Skript>
Standard exportieren {
  Name: "DynamicLoadComponent",
  Requisiten: {
    Renderkomponente: {
      Typ: Versprechen,
    },
  },
  Daten() {
    zurückkehren {
      comp: () => diese.renderComponent
    }
  },
  montiert() {},
};
</Skript>

<style lang="css" scoped></style>

Holen Sie sich die Hintergrunddaten direkt in die Routing-Konfiguration und verteilen Sie die Routen. Auf diese Weise wird die Routing-Logik in der Routing-Konfigurationsdatei konzentriert und es gibt kein sekundäres Routing. Die Wartung wird kein Problem sein.

Die Komponente DynamicLoadComponent kann auch wiederverwendet werden und alle nachfolgenden Routing-Konfigurationen zum Bestimmen der Seite zum Laden von Hintergrunddaten können an diese Zwischenkomponente weitergeleitet werden.

{
  Pfad: 'shopKPI',
  Komponente: () => import('@/views/store/components/DynamicLoadComponent'),
  Name: 'store_KPI',
  menuName: 'Shop-Berater',
  Meta: {
    Codes: ['storeProduct:detail'],
  },
  Requisiten: (Route) => ({
    renderComponent: neues Promise((auflösen, ablehnen) => {
      getStoreReportFormVersion()
        .then((responseData) => {
          const useNewShopKPI = get(responseData, 'data.data.shop_do');
          const useOldShopKPI = get(
            Antwortdaten,
            „Daten.Daten.Speichern_Daten_Anzeigen“
          );

          wenn (useNewShopKPI) {
            lösen (importieren ('@/views/store/ShopKPI'));
          } sonst wenn (useOldShopKPI) {
            lösen (importieren ('@/views/store/dataVersion'));
          } anders {
            lösen(importieren('@/views/store/ShopKPI/NoKPIService'));
          }
        })
        .fangen(ablehnen);
    }),
  })
}

Onlinebeispiel ansehen (unterstützt nur Chrome)
https://stackblitz.com/edit/vuejs-starter-jsefwq?file=index.js

Dies ist das Ende dieses Artikels über das Laden verschiedener Komponenten durch Vue Router je nach Hintergrunddaten. Weitere Informationen zum Laden verschiedener Komponenten durch Vue Router je nach Hintergrunddaten finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung des Ladens von Vue-Router-Daten und Zusammenfassung der Cache-Nutzung

<<:  Lösung für FEHLER 1054 (42S22) beim Ändern des Passworts in MySQL 5.7

>>:  Lösung für den MySQL-Server-Anmeldefehler ERROR 1820 (HY000)

Artikel empfehlen

Detaillierte Erklärung von MySQLs Seconds_Behind_Master

Inhaltsverzeichnis Sekunden_hinter_Master Ursprün...

Mehrere Möglichkeiten zum Sichern einer MySql-Datenbank

mysqldump-Tool-Sicherung Sichern Sie die gesamte ...

So stellen Sie nginx mit Docker bereit und ändern die Konfigurationsdatei

Nginx mit Docker bereitstellen, so einfach ist da...

Häufige Fehler bei der Verwendung von React Hooks

React Hooks ist eine neue Funktion, die in React ...

Vue-Grundlagen-Tutorial: Bedingtes Rendering und Listen-Rendering

Inhaltsverzeichnis Vorwort 1.1 Funktion 1.2 So st...

Grundlegende Verwendung von exists, in und any in MySQL

【1】existiert Verwenden Sie eine Schleife, um die ...

Detaillierte Erläuterung der Konzepte und Verwendung von Docker Swarm

Docker Swarm ist ein von Docker entwickelter Cont...

Installations- und Konfigurationstutorial von MongoDB unter Linux

MongoDB -Installation Wählen Sie die Installation...

Zusammenfassung der Wissenspunkte zum B-Tree-Index bei der MySQL-Optimierung

Warum müssen wir SQL optimieren? Wenn wir SQL-Anw...

MySQL-Tutorial: Ausführliche Erklärung zum Unterabfragebeispiel

Inhaltsverzeichnis 1. Was ist eine Unterabfrage? ...

Regeln für die Gestaltung des Anmeldeformulars

Ich habe „Patterns for Sign Up & Ramp Up“ vor ...