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 gccコマンドの具体的な使い方

01. コマンドの概要gcc コマンドは、GNU がリリースした C/C++ ベースのコンパイラを使...

WeChatアプレットは記録機能を実装します

この記事では、WeChatアプレットのレコード機能を実装するための具体的なコードを参考までに紹介しま...

ドメイン名を指定されたポートに転送するようにNginxを設定する方法

/usr/local/nginx/conf と入力する sudo cd /usr/local/ngi...

背景画像に CSS3 変換を適用するためのソリューション

CSS 変換は便利ですが、背景画像にはまだ適用されていません。この投稿では、背景画像を回転させたい場...

JavaScript データ型の詳細な説明

目次1. リテラル1.1 数値リテラル1.2 浮動小数点リテラル1.3 特別な値1.4 文字列リテラ...

CSV、Excel、SQL ファイルを MySQL にインポートするためのヒント

1. csvファイルをインポートする次のコマンドを使用します。 1.mysql> infile...

Linuxファイル削除後にスペースが解放されない問題の詳しい説明

序文システム領域の使用量が大きすぎて消去する必要がある場合、または特定のファイルを消去する必要がある...

Docker で Zookeeper をインストールする (スタンドアロンおよびクラスター)

Docker を起動したら、利用できるオプションを見てみましょう。 公式のものがある場合は、もちろ...

MySQL で特殊文字を含むデータベース名を作成する方法の例

序文この記事では、MySQL で特殊文字を使用してデータベース名を作成する方法について説明します。こ...

MySQL 5.7.20 Green Edition のインストールの詳細なグラフィックチュートリアル

まず、MySQL とは何かを理解しましょう。 MySQL は、スウェーデンの会社 MySQL AB ...

React サーバーサイドレンダリング原則の分析と実践

ほとんどの人は、サーバーサイド レンダリング (SSR と呼んでいます) の概念について聞いたことが...

Vue命令の実装原理の分析

目次1. 基本的な使い方2. 指示の動作原理2.1. 初期化2.2 テンプレートのコンパイル2.3....

MySQL のストレージ エンジンの違いと比較

MyISAM ストレージエンジンMyISAM は ISAM ストレージ エンジンに基づいており、それ...

マージントップ崩壊現象とその具体的解決策

マージントップの崩壊とはmargin-top の崩壊は、CSS ボックス モデルで発生する現象です。...

いくつかの CSS3 タグの短縮形 (推奨)

border-radius: CSS3 丸い角構文: border-radius: 25px;楕円...