Vue を使用した Amap アプリケーション開発のベスト プラクティス

Vue を使用した Amap アプリケーション開発のベスト プラクティス

序文

当社はこれまで、地図インタラクションに関連する多くの製品システムを開発してきました。現在、中国で主流の地図アプリケーション SDK は、AutoNavi、Baidu、Tencent の 3 つだけです。したがって、個人的には、Amap の開発は PC アプリケーションとしては比較的優れていると感じています。少なくとも、エクスペリエンス上、明らかな落とし穴はありません。この記事は、マップアプリケーションの開発の概要です。

非同期読み込み

js sdkアプリケーションが使用されているため、スクリプトファイル自体が非常に大きいため、読み込み時の白い画面の時間に注意し、ユーザーエクスペリエンスの問題を解決する必要があります。現在、ほとんどの製品アプリケーションはSPAシングルページアプリケーションシステムであるため、非同期読み込みメソッドをカプセル化します。

const loadScripts = 非同期スクリプト => {
  const get = src => {
    新しいPromise(function(resolve,reject)を返す{
      定数el = document.createElement('script')
      el.addEventListener('load', 関数() {
        解決(ソース)
      }、 間違い)
      el.addEventListener('エラー', 関数() {
        拒否(ソース)
      }、 間違い)
      el.id = src.id
      el.src = src.url
      document.getElementsByTagName('body')[0].appendChild(el) || document.getElementsByTagName('head')[0].appendChild(el)
    })
  }

  const myPromises = scripts.map(非同期スクリプト => {
    document.getElementById(script.id) が null の場合 {
      戻り、get(スクリプト)を待ちます
    }
  })

  Promise.all(myPromises) を待機して戻ります。
}

デフォルトのロードスクリプトをエクスポートする

スクリプトを読み込む際、このメソッドはまずページにスクリプトが存在するかどうかを判断します。存在する場合、スクリプトは再度読み込まれず、読み込み完了コールバックを使用して関連メソッドが実行されます。

パッケージコンポーネント

システム内にマップ アプリケーション サービスを必要とするページが複数ある場合は、プロジェクトの保守性を向上させるために、一般的なマップ コンポーネントをカプセル化する必要があります。ここでは、マップ アプリケーションを単純にカプセル化します。

<テンプレート>
  <div
    :style="{
      幅: 幅、
      高さ: 高さ
    }"
    クラス="amap-container"
  >
    <div ref="amap" class="amap">
      <スロット />
    </div>
  </div>
</テンプレート>

<style lang="scss" スコープ>
    .amapコンテナ{
    .amap {
        幅: 100%;
        高さ: 100%;
    }
    }
</スタイル>

マップ アプリケーション コンテナーを指定し、指定された高さと幅のレイヤーでラップし、高さと幅を外部変数として渡します。ビジネス ロジックは次のとおりです。

'@/loadScripts' から loadScripts をインポートします
エクスポートデフォルト{
  名前: 'AMapContainer',
  小道具: {
    幅: {
      必須: 偽、
      タイプ: 文字列、
      デフォルト: '100%'
    },
    身長:
      必須: 偽、
      タイプ: 文字列、
      デフォルト: '600px'
    },
    オプション:
      必須: 偽、
      タイプ: オブジェクト、
      デフォルト: () => {}
    }
  },
  データ: () => ({
    amap: null、
    マップ情報:
      キー: 'xxxxxxxxxxxxxxx'
    }
  })、
  作成された() {
    この.initAMap()
  },
  破棄する前に() {
    // マップを破棄する if (!this.amap) {
      戻る
    }
    this.amap.destroy()
    this.amap = null
  },
  メソッド: {
    マップを初期化する(){
      ロードスクリプト([{
        id: 'ampa',
        URL: `https://webapi.amap.com/maps?v=2.0&key=${this.amapInfo.key}&plugin=AMap.PolygonEditor`
      }]).then(() => {
        this.amap = 新しいウィンドウ.AMap.Map(this.$refs['amap'], this.options)
        this.$emit('map', this.amap, window.AMap)
      })
    }
  }
}

アプリケーションがロードされるときにマップ コンテナーを初期化します。つまり、Amap js sdk を非同期的にロードし、コールバック メソッドでマップ アプリケーションをインスタンス化し、インスタンス化されたマップ オブジェクトを $emit イベントに渡して、親コンポーネントのニーズに対応します。また、マップ アプリケーションは破棄ライフサイクル中に破棄する必要があることに注意してください。そうしないと、システム メモリを大量に消費します。

コンポーネントの使用

コンポーネントをカプセル化した後、対応するページに導入して使用できます。

<テンプレート>
    <amap-container の高さ="100%" :options="amapOptions" @map="getAMapData" />
</テンプレート>

<スクリプト>
    '@/components/AMap' から AMap をインポートします。

    エクスポートデフォルト{
        名前: 'AMapDemo',
        コンポーネント:
            'amap-container': AMap
        },
        データ: () => ({
            マップオプション: {
                ズーム: 14,
                サイズ変更を有効にする: true、
                表示モード: '3D',
                マップスタイル: 'amap://styles/normal'
            },
            AMap: null, // マップ オブジェクト amap: null // 現在のマップ インスタンス }),
        メソッド: {
            /**
             * マップ読み込み完了コールバック* @param amap
             * @param マップ
             */
            AMapData を取得します (amap, AMap) {
                // コンポーネントからマップ amap オブジェクトを取得します。this.amap = amap
                // コンポーネントからマップの AMap 静的オブジェクトを取得します。this.AMap = AMap
            }
        }
    }
</スクリプト>

そして、上記を踏まえて関連事業を展開します。地図アプリケーションの場合、最もコアとなるデータは地図アプリケーション内の座標です。地図マーキング要素、ポリライン要素(トラックなど)、描画要素など、対応する経度と緯度データを取得してデータベースに保存するだけで済みます。取得方法については、ここでは詳しく説明しません。

インターフェースをカスタマイズするためのベストプラクティス

以前作成したマップ アプリケーションでは、マーカーの詳細インターフェイス (マーカーを選択して左クリックするとインターフェイスが開きます) で、このインターフェイスにネイティブ ドキュメント オブジェクトを渡す必要がありますが、この記述方法は Vue オブジェクトに準拠していないため、多くのシステムでは DOM 構造の記述に多くの時間を費やしていました。これは本当に頭痛の種です。後でこの問題を解決するために、Vue にはコンポーネントをマウントして実際のドキュメント オブジェクトを取得する関連メソッドがありますか? 関連ドキュメントを参照した後、確かにこの API: Vue.extend があります。この API を使用してコンポーネント オブジェクトをマウントすると、インスタンス化されたコンポーネントのオブジェクトを取得できます。

'./components/ContextCard' から ContextCard をインポートします。

// マーカーを作成する const marker = new this.AMap.Marker({
  マップ: this.amap,
  位置: [119.058904, 33.537069]
})
// クリックイベントをバインド marker.on('click', this.markerInfoWindow)

// クリックするとポップアップウィンドウが開きます const markerInfoWindow = () => {
  //Vue コンポーネント コンストラクターのインスタンス化を導入する const ContextCardContent = Vue.extend(ContextCard)
  // マウントコンポーネント const contextCardContent = new ContextCardContent().$mount()
  // ウィンドウオブジェクトをインスタンス化します this.amapInfoWindow = new this.AMap.InfoWindow({
    isCustom: true、
    コンテンツ: contextCardContent.$el、
    オフセット: 新しい this.AMap.Pixel(0, -40)
  })
  // ウィンドウを開く this.amapInfoWindow.open(this.amap, marker.getPosition())
  // ウィンドウを閉じるためのコンポーネント イベントをリッスンします contextCardContent.$on('closeWindow', () => this.amapInfoWindow.close())
}

ContextCard.vue コンポーネント:

<テンプレート>
  <el-card class="コンテキストボックスカード ボックスカード">
    <div スロット="ヘッダー" クラス="ヘッダー">
      <span>カード名</span>
      <el-button type="text" class="close-btn" @click="closeWindow">閉じる</el-button>
    </div>
    <div v-for="o in 4" :key="o" class="テキスト項目">
      {{ 'リストコンテンツ' + o }}
    </div>
  </el-card>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前: 'AMapContextCard',
  メソッド: {
    ウィンドウを閉じる() {
      this.$emit('closeWindow')
    }
  }
}
</スクリプト>

<style lang="scss" スコープ>
.コンテキストボックスカード{
  幅: 320ピクセル;
  高さ: 200px;

  .ヘッダー{
    ディスプレイ: フレックス;
    コンテンツの両端揃え: スペースの間;
    アイテムの位置を中央揃えにします。
  }

  ::v-deep .el-card__header {
    パディング: 5px 20px;
  }
}
</スタイル>

上記は、Vue.extend コンストラクターを使用してコンポーネントをインスタンス化し、ポップアップ ウィンドウの詳細情報を開く句読点です。これにより、プロジェクトの堅牢性が大幅に向上します。

「vue」からVueをインポートします。
「./App.vue」からアプリをインポートします。

「element-ui」から要素をインポートします。

"normalize.css/normalize.css"をインポートします。
「element-ui/lib/theme-chalk/index.css」をインポートします。

Vue.config で productionTip を false に設定します。

Vue.use(要素);

新しいVue({
  レンダリング: (h) => h(App)
}).$mount("#app");

要約する

これで、Vue を使用した Amap アプリケーションの開発に関するこの記事は終了です。Vue Amap アプリケーションに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • VueはAmapを使用して都市の位置特定を実現
  • vue+Amapは地図検索とクリック位置決め操作を実現します
  • VueでのAmap導入と軌跡描画の実装
  • VueはAMap Gaode Mapの実装コードを導入します
  • Vue でネイティブ Amap を使用する方法をご存知ですか?

<<:  CentOS 8 カスタム ディレクトリ インストール nginx (チュートリアルの詳細)

>>:  MySQL の行レベルロックの詳細な例

推薦する

Linux の MariaDB データベースについて

目次Linux の MariaDB データベースについて1. データベースとは何ですか? 2. デー...

Nodejs のグローバル変数とグローバルオブジェクトの知識ポイントと使用方法の詳細

1. グローバルオブジェクトすべてのモジュールは呼び出すことができます1) global: ブラウザ...

FastApi+Vue+LayUIを使用してフロントエンドとバックエンドを分離するサンプルコード

目次序文プロジェクト設計後部フロントエンドプロジェクトを実行する質疑応答序文これまでの API 開発...

Linuxの貼り付けコマンドの使い方

01. コマンドの概要貼り付けコマンドは各ファイルを列ごとに結合します。これは、2 つの異なるファイ...

初心者向けのMySQLデータベースとテーブルDDLの作成と操作の学習

目次1. データベースを操作する1.1 データベースを作成する1.2 データベースをクエリする1.3...

JavaScript プロトタイプとプロトタイプチェーンの深い理解

目次1. プロトタイプとは何ですか? 2. プロトタイプ__プロト__ 4. コンストラクター5. ...

Centos8 でローカル Web サーバーを構築するための実装手順

1 概要システム Centos8 では、httpd を使用してローカル Web サーバーを構築します...

MySQLデータベースの基本構文と操作

MySQLデータベースの基本構文DDL操作データベース作成構文: create database デ...

MySQL インデックスの一般的な問題の概要

Q1: データベースにはどのようなインデックスがありますか?メリットとデメリットは何ですか? 1. ...

Vue ページに img 画像を導入する方法

HTMLを学ぶとき、画像タグ<img>は画像を導入します <img src=&qu...

Alibaba Cloud Server の詳細な展開 (グラフィック チュートリアル)

最近、Web 開発のフロントエンドとバックエンドの技術を学んだので、その後の管理を容易にするためにプ...

CSS3 でシンプルな白い雲が浮かぶ背景効果を実現

これは非常にシンプルな純粋な CSS3 の白い雲の浮遊する背景効果です。浮かぶ白い雲の特殊効果は、C...

Docker での Redis 接続の急増をトラブルシューティングした実践的な記録

土曜日、本番サーバー上の Redis サーバーが利用できなくなり、エラー メッセージは次のようになり...

Linux システムでの virtuoso データベースの詳細なインストールと使用

最近、リンク データについていくつか調査していて、rdf データベースを使用する必要があったため、v...

CSS を使用してデータ ホットスポット効果を実現する方法

効果は以下のとおりです。 分析する1. ここでは、点を囲む 3 つの円がズームアニメーションを実行し...