Fallstricke beim dynamischen Menü, dynamischen Laden von Routen und Aktualisieren in Vue

Fallstricke beim dynamischen Menü, dynamischen Laden von Routen und Aktualisieren in Vue

brauchen:

Untermenüdaten dynamisch von der Schnittstelle abrufen. Dynamisches Laden erfordert, dass Untermenüdaten nur geladen werden, wenn sie erweitert werden. Aktualisieren wird unterstützt und die Seite wird normal angezeigt.

Ideen:

Am Anfang war es etwas chaotisch, mit vielen Ideen. Ich habe viel nachgedacht

Zunächst teilen sich Route und Menü eine globale Route, und Daten werden auch über die Store-Route übertragen. Dann sind die beiden zu berücksichtigenden Punkte das Rendern des Menüs und das Laden der Route. Die Route und die Aktualisierung können an erster Stelle der Navigation verarbeitet werden.

Eine weitere Möglichkeit besteht darin, Menüdaten und Routing im Erweiterungsereignis der Menükomponente neu zu generieren. Die Grundidee ist ähnlich, und ich vergesse sie, nachdem ich fertig bin ... Das Aktualisierungsproblem muss vom lokalen Cache behandelt werden. Bisher wurden die Routen-Big-Data zwischengespeichert, aber dieser lokale Speicher speichert nur Zeichenfolgen und kann keine Objekte zwischenspeichern. In diesem Fall wird das Menü angezeigt, aber die dynamische Route ist 404, da das von json.parse konvertierte Objekt nicht die tatsächlichen Routendaten sind und separat behandelt werden müssen. Die Komponente ist ein Funktionsobjekt.
Das sind alles Fallstricke … deshalb bin ich vorher einige Umwege gegangen und habe meine Ideen nicht durchdacht.

Am nächsten Tag ordnete ich meine Gedanken neu und dachte darüber nach, warum ich das gesamte Routenobjekt zwischenspeichern musste. Ist das dumm? Dynamische Daten sind nur ein Teil des dreistufigen Menüs ... Warum werden sie nicht separat gespeichert? Speichern Sie die dynamischen Menüdaten lokal, verwenden Sie die vollständige Routenvorlage, nehmen Sie das initialisierte Routenobjekt heraus, führen Sie dann eine Schleife der Menüdaten aus, legen Sie das untergeordnete Attribut dynamisch fest und generieren Sie ein neues vollständiges Routenobjekt. Ist addRoute nicht besser? Als ich darüber nachdachte, ordnete ich die gesamte Idee.

[Globales Routenobjekt definieren] => [Erste Position der Navigation aktualisieren, Route im Store initialisieren und laden, damit sie leer ist] => [Routing und Menü initialisieren] => [Im Menüerweiterungsereignis die Schnittstelle anfordern, Untermenüdaten abrufen, Menüdaten im lokalen Store speichern und Route aktualisieren]
Es gibt auch einige kleine Fallstricke, wie wiederholtes Routing, Aktualisieren von 404-Problemen, Aktualisieren des weißen Bildschirms, asynchrone Verarbeitung ...

Lektion:

Das Problem kann definitiv gelöst werden. Nach ein paar Tagen des Kämpfens wurde mir schließlich klar, dass die Idee das Wichtigste ist

Falsches Denken ist Zeitverschwendung

Denken Sie zuerst an die Idee, den vollständigen Implementierungsweg, was zuerst und was später zu tun ist. Wenn Sie auf technische Schwierigkeiten stoßen, gehen Sie zu Baidu

Teile den Text:

Heftige Postleitzahl! ! ! ! ! ! ! ! ! ! ! ! !

Global definierte Store-Route-Objekte werden ignoriert

Vue von „vue“ importieren
Router von „vue-router“ importieren
Layout aus '@/layout' importieren

Vue.use(Router)

exportiere const konstanteRouten = [{
  Pfad: '/login',
  Name: 'Anmelden',
  Komponente: () => import('@/views/login/index'),
  versteckt: wahr,
}, {
  Pfad: '/404',
  Name: '404',
  Komponente: () => import('@/views/error-page/404'),
  versteckt: wahr
}, {
  Pfad: '/401',
  Name: '401',
  Komponente: () => import('@/views/error-page/401'),
  versteckt: wahr
}, {
  Weg: '/',
  Komponente: Layout,
  Umleitung: '/dashboard',
  Kinder: [
    {
      Pfad: 'Dashboard',
      Komponente: () => import('@/views/dashboard/index'),
      Name: "Dashboard",
      meta: { Titel: 'Homepage', Symbol: 'Dokumentation' }
    },
    {
      Pfad: 'xxx',
      Komponente: () => import('xxxxx'),
      Name: "xxx",
      Meta: {Titel: „XXX“, Symbol: „Komponente“},
      Kinder: [
          {
            Pfad: 'Host',
            Name: 'Host',
            Meta: { 
              Titel: 'xxx', 
              Schlüssel: "Host"
            }
          },
          {
            Pfad: "Steuerung",
            Name: "Steuerung",
            alwaysShow: true,
            Meta: { 
              Titel: 'xxx', 
              Taste: „Steuerung“
            },
            Kinder: []
          },
          {
            Pfad: "Signal",
            Name: "Signal",
            alwaysShow: true,
            Meta: { 
              Titel: 'xxx', 
              Schlüssel: 'Signal',
            },
            Kinder: [] 
          },
          {
            Pfad: 'Gateway',
            Name: "Gateway",
            alwaysShow: true,
            Meta: { 
              Titel: 'xxx', 
              Schlüssel: „Gateway“
            },
            Kinder: []
          } 
      ]
    },
    {
      Pfad: "Treffen",
      Name: 'Treffen',
      Meta: {Titel: „xxx“, Symbol: „Liste“}
    },
    {
      Pfad: „Spuren“,
      Komponente: () => import('@/views/xxx'),
      Name: 'Spuren',
      Meta: {Titel: „xxx“, Symbol: „Diagramm“}
    }
]
}, 
  {
    Weg: '*',
    Weiterleitung: '/404',
    versteckt: wahr
  }
]

const router = neuer Router({
  // Modus: „Verlauf“, // Serviceunterstützung erforderlich
  scrollVerhalten: () => ({
    j: 0
  }),
  //Routen: Initialisierung von constantRoutes-Guards, hier auskommentiert})

//Lösen Sie das Problem wiederholter Routen router.$addRoutes = (params) => {
  router.matcher = neuer Router({ // Routing-Regeln zurücksetzen scrollBehavior: () => ({
      j: 0
    })
  }).matcher
  router.addRoutes(params) // Routen hinzufügen}

Standardrouter exportieren
//Überwachungsrouten zum Schutz dynamischer Routen router.beforeEach((to, from, next) => {
  
  const routes = store.state.app.routes

  console.error('beforeEach-Schutz ausgeführt')

  //Erste Ladeaktualisierung verarbeiten, wenn (routes.length === 0) {
     console.error('Erstes Mal/aktualisiert')

     //Routen-Cache aktualisieren const cacheRoute = getLocalRouteInfo()
     
     const routeValue = asyncRouteDataToRoute(cacheRoute.asyncRouteData, constantRoutes)
     
     speichern
      .dispatch('app/setRoutes', Routenwert)

     router.$addRoutes([...routenwert])

     nächste({
        ...Zu,
        ersetzen: wahr
     })
     zurückkehren
   } 

   nächste()
})
/**
 * Aktualisieren Sie die Routing-Metadaten des Untermenüs der dritten Ebene */
export const updateIPChildRoutes = Funktion(Routen, Pfad, Kinder) {
    returniere setRouteArrayChildren(Routen, Pfad, untergeordnete Elemente)
}

/**
 * Untermenü entsprechend dem übergeordneten Menü laden * @param {*} routeKey 
 * @returns 
 */
exportiere const generateIPChildRoutes = function(routeKey) {
    returniere neues Promise((lösen, ablehnen) => {
      wenn (!routeKey) return
      
      
      // const start = getDateSeconds(neues Date())
      // const end = setDateSeconds(neues Date(), 15, 'm')
      
      const filterAddr = grafanaAddrs.filter(addr => addr.key === routeKey)[0]
      const matchup = filterAddr.matchup
  
      Konstante Parameter = {
        Zusammenspiel
      } 
  
      //Router dynamisch hinzufügen
      versuchen {
        fetchIPInstance(params).then(ipAddrs => {
          const ipRoutes = []
          ipAddrs.fürJeden(
            Adresse => {
                const ipInstance = addr.instance.replace(/^(.*):.*$/, "$1")
  
                wenn(!istIPAdresse(ipInstance)) 
                  zurückkehren
  
                const existRoute = ipRoutes.find(ip => ip.meta && ip.meta.key === ipInstance)
  
                !existRoute && ipRoutes.push(
                  {
                    Pfad: ipInstance,
                    Name: ipInstance,
                    Meta: { 
                        Titel: ipInstance, 
                        Schlüssel: ipInstance
                    }
                  }
                )
            }
          )
          auflösen(ipRoutes)
        })
      } Fehler abfangen {
        ablehnen(Fehler)
        console.error(`Fehler beim Laden des Untermenüs`)
      }
    })
}
importiere { isArray, setRouteArrayChildren } von './tool'

// Routen-Cache-Wert festlegen const localRouteKey = "LOCALROUTESET";

/**
 * currentPath: '' // Aktuell aufgerufener Routenpfad * routeData: [], // Gespeicherte komplette Routendaten (nur beim Laden des Menüs verfügbar)
 * asyncRouteData: [] //Dynamische Routendaten (werden zum Generieren neuer Routen verwendet)
 * {
 * parentKey //übergeordneter Schlüssel
 * Route: [
 * {
            Weg: ,
            Name: ,
            Meta: { 
                Titel: , 
                Schlüssel: 
            }
        }
 * ]
 * }
 */

Exportfunktion getLocalRouteInfo() {
  const data = localStorage.getItem(localRouteKey);

  Daten zurückgeben? JSON.parse(Daten): {};
}

Exportfunktion setLocalRouteInfo(Daten) {
  const localData = getLocalRouteInfo();

  localStorage.setItem(
    lokalerRoutenschlüssel,
    JSON.stringify({
      ...lokaleDaten,
      ...Daten,
    })
  );
}

Exportfunktion removeLocalRouteInfo() {
  localStorage.removeItem(localRouteKey);
}

/**
 * Lokaler Cache in Routing-Metadaten umgewandelt* @param {*} constantRoutes Routing-Vorlage*/
Exportfunktion asyncRouteDataToRoute(asyncRouteData, constantRoutes) {
   let route = konstanteRouten
   wenn (isArray(asyncRouteData) und asyncRouteData.length > 0) {
     asyncRouteData.fürJeden(
        Daten => {
          Route = setzeRouteArrayChildren(Route, Daten.übergeordneterSchlüssel, Daten.Route)
        }
     )
   }
   Rückweg
}
/**
 * Legen Sie die untergeordneten Routenattribute fest * @param {*} Routen 
 * @param {*} Pfad 
 * @param {*} untergeordnete Elemente 
 * @returns 
 */
export const setRouteArrayChildren = Funktion(Routen, Pfad, Kinder) {

  wenn (!isArray(routes) || !path)
     gibt neues Array zurück()
  
  für (const Route von Routen) {
    wenn (istArray(route.children)) {
      wenn (route.pfad === Pfad && route.children.length === 0) {
        route.children.push(...Kinder)
      } anders {
        setRouteArrayChildren(route.children, Pfad, Kinder)
      }
    }
  }

  Hin- und Rückwege
}
onExpandMenu(Schlüssel, Schlüsselpfad) {
      console.error(Schlüssel, Schlüsselpfad)

      const Pfad = Schlüssel.Substring(Schlüssel.lastIndexOf('/') + 1)
      console.error(Pfad)
      

      //Überwachungsmenü/Routing der Ebene 3 dynamisch generieren const ipAddrKeys = []
      grafanaAddrs.fürJeden(
        Adresse => {
          wenn (Adresse.Übereinstimmung) {
            ipAddrKeys.push(Adresse.Schlüssel)
          }
        }
      )

      if (Pfad && ipAddrKeys.includes(Pfad)) {

         generateIPChildRoutes(Pfad)
         .then(ipAddrs => {
           
          wenn (isArray(ipAddrs)) {

            //Dynamische Routingdaten zwischenspeichern const localRouteInfo = getLocalRouteInfo()
            const cacheRoutes = localRouteInfo.asyncRouteData || []
            cacheRoutes.push(
                {
                    parentKey: Pfad,
                    route:ipAdressen
                }
              )
            setLocalRouteInfo({
              asyncRouteData: CacheRouten
            })

            //Route aktualisieren
            let asyncRoutes = store.state.app.routes

            asyncRoutes = updateIPChildRoutes(asyncRoutes, Pfad, IP-Adressen)
            
            speichern
              .dispatch('app/setRoutes', asyncRoutes)
            
            router.$addRoutes([...asyncRoutes])

          }
         })
      }
    }

Andere Codes gehören nicht zum Kern und werden nicht veröffentlicht.

Zusammenfassen

Dies ist das Ende dieses Artikels über Vue Dynamic Menu, Dynamic Route Loading und Refresh Fallstricke. Weitere verwandte Inhalte zu Vue Dynamic Menu und Dynamic Route Loading 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:
  • Lösung für das Leerstellenproblem der dynamischen Menüaktualisierung basierend auf Vue
  • Beispiel für die Verwendung von addRoutes zur Implementierung dynamischer Weiterleitung in Vue
  • Ideen und Methoden zur Implementierung mehrstufiger verschachtelter Breadcrumbs mit dynamischem Vue-Routing
  • Detaillierte Erläuterung des dynamischen Routings in der Vue-Reihe [Original]
  • Detaillierte Erläuterung des Vue-Routings (dynamisches Routing, Routing-Verschachtelung)
  • Vue: Dynamische Routing-Konfiguration und Routing-Parameter-Übergabemethode
  • Erklären Sie, was dynamisches Routing im Vue-Router ist
  • Umfassende Analyse der grundlegenden Verwendung des Vue-Routers (dynamisches Routing, verschachteltes Routing)

<<:  Tutorial zur HTML-Tabellenauszeichnung (6): Farbattribut für dunkle Rahmen BORDERCOLORDARK

>>:  Lösungen für häufige Probleme bei der Verwendung von Elasticsearch

Artikel empfehlen

MySQL-Reihe: Datenbankdesign, drei Paradigmen, Tutorial-Beispiele

Inhaltsverzeichnis 1. Wissensbeschreibung der dre...

Detaillierte Erklärung des Middleman-Modus von Angular-Komponenten

Inhaltsverzeichnis 1. Mittelsmann-Modell 2. Beisp...

Detaillierte Erläuterung des MySQL MVCC-Mechanismusprinzips

Inhaltsverzeichnis Was ist MVCC Mysql-Sperre und ...

So installieren Sie das ZSH-Terminal in CentOS 7.x

1. Installieren Sie grundlegende Komponenten Führ...

So starten Sie die RabbitMq-Software automatisch, wenn CentOS gestartet wird

1. Erstellen Sie ein neues Rabbitmq im Verzeichni...

Docker-Compose erstellt schnell Schritte für ein privates Docker-Warehouse

Erstellen Sie docker-compose.yml und füllen Sie d...

Detaillierte Schritte zur Installation von MySql 5.7.21 unter Linux

Vorwort Die am häufigsten verwendete Datenbank in...

js, um einen 3D-Karusselleffekt zu erzielen

In diesem Artikel wird der spezifische Code zur I...

So verwenden Sie den Vue-Filter

Inhaltsverzeichnis Überblick Filter definieren Ve...

Detaillierte Erklärung, wie Angular mit unerwarteten Ausnahmefehlern umgeht

Vorne geschrieben Unabhängig davon, wie gut der C...