Best Practices für die Entwicklung von Amap-Anwendungen mit Vue

Best Practices für die Entwicklung von Amap-Anwendungen mit Vue

Vorwort

Wir haben bereits viele Produktsysteme im Zusammenhang mit der Karteninteraktion entwickelt. Derzeit gibt es in China nur wenige gängige SDKs für Kartenanwendungen: AutoNavi, Baidu und Tencent. Daher bin ich persönlich der Meinung, dass die Entwicklung von Amap für PC-Anwendungen relativ besser ist, zumindest gibt es keine offensichtlichen Fallstricke in der Erfahrung. Dieser Artikel ist eine Zusammenfassung der Entwicklung von Kartenanwendungen.

Asynchrones Laden

Da die JS-SDK-Anwendung verwendet wird, ist die Skriptdatei selbst sehr groß. Daher müssen wir auf die Ladezeit des weißen Bildschirms achten und das Problem der Benutzererfahrung lösen. Derzeit sind die meisten Produktanwendungen SPA-Einzelseitenanwendungssysteme. Daher kapsele ich eine asynchrone Lademethode:

const loadScripts = asynchrone Skripte => {
  const get = src => {
    returniere neues Promise(Funktion(auflösen, ablehnen) {
      const el = document.createElement('Skript')
      el.addEventListener('laden', Funktion() {
        auflösen (Quelle)
      }, FALSCH)
      el.addEventListener('Fehler', Funktion() {
        ablehnen(Quelle)
      }, FALSCH)
      el.id = src.id
      el.src = src.url
      document.getElementsByTagName('body')[0].appendChild(el) || document.getElementsByTagName('head')[0].appendChild(el)
    })
  }

  const meinePromises = scripts.map(async script => {
    wenn (document.getElementById(script.id) === null) {
      Rückgabe, warte auf „get“ (Skript)
    }
  })

  returniere und warte auf Promise.all(meinePromises)
}

Standard-LoadScripts exportieren

Beim Laden eines Skripts ermittelt diese Methode zunächst, ob das Skript auf der Seite vorhanden ist. Wenn dies der Fall ist, wird es nicht ein zweites Mal geladen. Anschließend wird der Rückruf für den Ladeabschluss verwendet, um verwandte Methoden auszuführen.

Paketkomponenten

Wenn das System mehrere Seiten enthält, die Kartenanwendungsdienste erfordern, müssen Sie eine allgemeine Kartenkomponente kapseln, um die Wartbarkeit des Projekts zu verbessern. Ich werde die Kartenanwendung hier einfach kapseln:

<Vorlage>
  <div
    :Stil="{
      Breite: Breite,
      Höhe: Höhe
    }"
    Klasse="amap-container"
  >
    <div ref="amap" class="amap">
      <Steckplatz />
    </div>
  </div>
</Vorlage>

<style lang="scss" scoped>
    .amap-container {
    .amap {
        Breite: 100 %;
        Höhe: 100%;
    }
    }
</Stil>

Geben Sie einen Kartenanwendungscontainer an, umschließen Sie ihn mit einer Ebene mit angegebener Höhe und Breite und übergeben Sie Höhe und Breite als externe Variablen. Die Geschäftslogik lautet wie folgt:

importiere loadScripts aus '@/loadScripts'
Standard exportieren {
  Name: 'AMapContainer',
  Requisiten: {
    Breite: {
      erfordern: falsch,
      Typ: Zeichenfolge,
      Standard: „100 %“
    },
    Höhe:
      erfordern: falsch,
      Typ: Zeichenfolge,
      Standard: „600px“
    },
    Optionen:
      erfordern: falsch,
      Typ: Objekt,
      Standard: () => {}
    }
  },
  Daten: () => ({
    amap: null,
    amapInfo:
      Schlüssel: "xxxxxxxxxxxxxxx"
    }
  }),
  erstellt() {
    dies.initAMap()
  },
  vorZerstören() {
    // Zerstöre die Karte, wenn (!this.amap) {
      zurückkehren
    }
    dies.amap.destroy()
    this.amap = null
  },
  Methoden: {
    initAMap() {
      LadeSkripte([{
        ID: 'ampa',
        URL: `https://webapi.amap.com/maps?v=2.0&key=${this.amapInfo.key}&plugin=AMap.PolygonEditor`
      }]).then(() => {
        this.amap = neues Fenster.AMap.Map(this.$refs['amap'], this.options)
        dies.$emit('map', dies.amap, fenster.AMap)
      })
    }
  }
}

Initialisieren Sie den Kartencontainer, wenn die Anwendung geladen wird: Laden Sie das Amap js SDK asynchron, instanziieren Sie dann die Kartenanwendung in der Rückrufmethode und übergeben Sie das instanziierte Kartenobjekt an das $emit-Ereignis, um die Anforderungen der übergeordneten Komponente zu erfüllen. Beachten Sie auch, dass die Kartenanwendung während des Zerstörungslebenszyklus zerstört werden muss, da sie sonst viel Systemspeicher beansprucht.

Verwenden von Komponenten

Nach dem Einkapseln der Komponente können Sie diese auf der entsprechenden Seite einführen und verwenden:

<Vorlage>
    <amap-container Höhe="100%" :Optionen="amapOptions" @map="getAMapData" />
</Vorlage>

<Skript>
    importiere AMap aus '@/components/AMap'

    Standard exportieren {
        Name: 'AMapDemo',
        Komponenten:
            'amap-container': AMap
        },
        Daten: () => ({
            amapOptionen: {
                Zoom: 14,
                resizeEnable: wahr,
                Ansichtsmodus: "3D",
                Kartenstil: "amap://styles/normal"
            },
            AMap: null, // Map-Objekt amap: null // aktuelle Map-Instanz }),
        Methoden: {
            /**
             * Rückruf zum Abschluss des Kartenladens * @param amap
             * @param AMap
             */
            getAMapData(amap, AMap) {
                // Holen Sie sich das Map-Amap-Objekt aus der Komponente this.amap = amap
                // Holen Sie sich das statische Map-AMap-Objekt aus der Komponente this.AMap = AMap
            }
        }
    }
</Skript>

Entwickeln Sie dann auf dieser Grundlage verwandte Geschäftsbereiche. Bei Kartenanwendungen sind die Koordinaten in der Kartenanwendung die wichtigsten Daten. Unabhängig davon, ob es sich um ein Kartenmarkierungselement, ein Polylinienelement (Spur usw.), ein Zeichenelement usw. handelt, müssen Sie nur die entsprechenden Längen- und Breitengraddaten abrufen und in der Datenbank speichern. Wie Sie diese abrufen, werde ich hier nicht näher erläutern.

Best Practices zum Anpassen von Schnittstellen

In der Kartenanwendung, die ich zuvor erstellt habe, erforderte diese Schnittstelle in der detaillierten Schnittstelle des Markers (wählen Sie einen Marker aus und klicken Sie mit der linken Maustaste, um die Schnittstelle zu öffnen) die Übergabe des nativen Dokumentobjekts. Diese Schreibmethode entspricht jedoch nicht dem Vue-Objekt. Daher verbrachten viele Systeme viel Zeit damit, die DOM-Struktur zu schreiben, was wirklich Kopfschmerzen bereitete. Um dieses Problem später zu lösen: Verfügt Vue über eine verwandte Methode zum Mounten der Komponente, um das echte Dokumentobjekt zu erhalten? Nach Konsultation der entsprechenden Dokumente gibt es tatsächlich diese API: Vue.extend. Wenn Sie diese API zum Mounten des Komponentenobjekts verwenden, können Sie das Objekt der instanziierten Komponente abrufen.

ContextCard aus „./components/ContextCard“ importieren

// Einen Marker erstellen const marker = new this.AMap.Marker({
  Karte: diese.amap,
  Position: [119.058904, 33.537069]
})
// Klickereignis marker.on('click', this.markerInfoWindow) binden

// Klicken, um das Popup-Fenster zu öffnen const markerInfoWindow = () => {
  //Instanziierung des Vue-Komponentenkonstruktors einführen const ContextCardContent = Vue.extend(ContextCard)
  // Komponente einbinden const contextCardContent = new ContextCardContent().$mount()
  // Instanziieren Sie das Fensterobjekt this.amapInfoWindow = new this.AMap.InfoWindow({
    isCustom: wahr,
    Inhalt: contextCardContent.$el,
    Offset: neu this.AMap.Pixel(0, -40)
  })
  //Öffne das Fenster this.amapInfoWindow.open(this.amap, marker.getPosition())
  // Auf Komponentenereignisse warten, um das Fenster zu schließen contextCardContent.$on('closeWindow', () => this.amapInfoWindow.close())
}

ContextCard.vue-Komponente:

<Vorlage>
  <el-card Klasse="Kontext-Box-Karte Box-Karte">
    <div Slot="Header" Klasse="Header">
      <span>Kartenname</span>
      <el-button type="text" class="close-btn" @click="closeWindow">Schließen</el-button>
    </div>
    <div v-for="o in 4" :key="o" class="textelement">
      {{ 'Listeninhalt' + o }}
    </div>
  </el-Karte>
</Vorlage>

<Skript>
Standard exportieren {
  Name: 'AMapContextCard',
  Methoden: {
    Fenster schließen() {
      dies.$emit('Fenster schließen')
    }
  }
}
</Skript>

<style lang="scss" scoped>
.Kontextbox-Karte {
  Breite: 320px;
  Höhe: 200px;

  .header {
    Anzeige: Flex;
    Inhalt ausrichten: Abstand dazwischen;
    Elemente ausrichten: zentrieren;
  }

  ::v-tief .el-card__header {
    Polsterung: 5px 20px;
  }
}
</Stil>

Das Obige ist ein Satzzeichen, das die detaillierten Informationen des Popup-Fensters öffnet. Zum Instanziieren der Komponente wird der Konstruktor Vue.extend verwendet. Dies verbessert die Robustheit des Projekts erheblich.

importiere Vue von „vue“;
App aus "./App.vue" importieren;

Element aus „element-ui“ importieren;

importiere "normalize.css/normalize.css";
importiere "element-ui/lib/theme-chalk/index.css";

Vue.config.productionTip = falsch;

Vue.use(Element);

neuer Vue({
  rendern: (h) => h(App)
}).$mount("#app");

Zusammenfassen

Dies ist das Ende dieses Artikels über die Entwicklung von Amap-Anwendungen mit Vue. Weitere relevante Inhalte zu Vue Amap-Anwendungen finden Sie in früheren Artikeln auf 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:
  • Vue nutzt Amap zur Realisierung der Stadtpositionierung
  • vue + Amap realisiert Kartensuche und Klickpositionierungsvorgang
  • Implementierung der Amap-Einführung und Trajektorienzeichnung in Vue
  • Vue stellt den Implementierungscode von AMap Gaode Map vor
  • Wissen Sie, wie Sie natives Amap in Vue verwenden?

<<:  CentOS 8: Installation des benutzerdefinierten Verzeichnisses nginx (Details zum Tutorial)

>>:  Detailliertes Beispiel für Zeilensperren in MySQL

Artikel empfehlen

Eine Methode zum Erstellen von Karussellbildern mit CSS3

Diashows sieht man häufig auf Webseiten. Sie enth...

Detaillierte Erläuterung der vier Transaktionsisolationsebenen in MySQL

Die Testumgebung dieses Experiments: Windows 10+c...

Vue implementiert bidirektionale Datenbindung

In diesem Artikelbeispiel wird der spezifische Co...

25 Tools zur Verbesserung der Website-Benutzerfreundlichkeit und Conversion-Raten

Bei einer Website bezieht sich die Benutzerfreundl...

XHTML-Einführungstutorial: Verwendung von Listen-Tags

Listen werden verwendet, um eine Reihe ähnlicher o...

Vor- und Nachteile von React Hooks

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

Herausforderung des HTML-Symbol-zu-Entity-Algorithmus

Herausforderung: Wandelt die Zeichen &, <,...

Lösen Sie das Problem des Vergessens von Passwörtern in MySQL 5.7 unter Linux

1. Problem Passwort für mysql5.7 unter Linux verg...

Einfaches Beispiel zum Hinzufügen und Entfernen von HTML-Knoten

<br />Einfaches Beispiel zum Hinzufügen und ...

CSS-Float-Eigenschaftsdiagramm, Details der Float-Eigenschaft

Die korrekte Verwendung der CSS-Float-Eigenschaft...