VorwortWir 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 LadenDa 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. PaketkomponentenWenn 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 KomponentenNach 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 SchnittstellenIn 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"); ZusammenfassenDies 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:
|
<<: CentOS 8: Installation des benutzerdefinierten Verzeichnisses nginx (Details zum Tutorial)
>>: Detailliertes Beispiel für Zeilensperren in MySQL
Diashows sieht man häufig auf Webseiten. Sie enth...
Die Testumgebung dieses Experiments: Windows 10+c...
In diesem Artikelbeispiel wird der spezifische Co...
Bei einer Website bezieht sich die Benutzerfreundl...
Inhaltsverzeichnis 1. Gemeinsam genutztes CommonM...
Die Installation der Dekomprimierungsversion von ...
Listen werden verwendet, um eine Reihe ähnlicher o...
Inhaltsverzeichnis Vorwort Vorteil: Mangel: 1. Re...
Herausforderung: Wandelt die Zeichen &, <,...
1. Problem Passwort für mysql5.7 unter Linux verg...
1. Verwenden Sie das Playbook von Ansible, um htt...
<br />Einfaches Beispiel zum Hinzufügen und ...
Wirkung: Der Titel hat eine eigene Seriennummer, ...
Die korrekte Verwendung der CSS-Float-Eigenschaft...
Ich habe kürzlich an einem Projekt gearbeitet – Bu...