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 の行レベルロックの詳細な例

推薦する

DQL コマンドを使用して MySQL でデータをクエリする方法

この記事では、MySQL でよく使用されるデータ クエリ言語について説明します。 DQL (データク...

MySQLで置換関数を実装するためのいくつかの実用的なシナリオ

REPLACE構文REPLACE(String,from_str,to_str)つまり、String...

Oracle の MySQL バージョンでユーザー Scott のテーブル ステートメントを作成する例

概要: Oracle scottユーザーには4つのテーブルがあり、実験やデータ検証に便利です。現在は...

MySQLデータベースのトランザクション分離レベルの詳細な説明

データベーストランザクション分離レベルデータベース トランザクションには、低から高まで 4 つの分離...

MySQLパーティションテーブルは月別に分類されています

目次テーブルを作成するデータベース ファイルを表示します。入れるクエリ消去補足:Mysqlは月テーブ...

process.env.NODE_ENV 本番環境モードを設定する方法

始める前に、process.env.NODE_ENV にはデフォルトで開発と本番の 2 つの状態しか...

JSはreduce()メソッドを使用してツリー構造データを処理します

目次意味文法例1. 初期値initが渡されない2. 初期値を渡す場合3. アレイの重複排除4. Re...

Vueはユーザー名が使用可能かどうかの検証を実装します

この記事では、ユーザー名が使用可能かどうかを確認するためのVueの具体的なコードを例として紹介します...

データベースの削除から逃走までの MySQL の徹底分析_上級編 (I) - データ整合性

1. データ整合性の概要1. データ整合性の概要データの冗長性とは、データベース内に重複したデータが...

Docker ベースの Redis 1 マスター、2 スレーブ、3 センチネルの実装

現在、Redis とコンテナについて学習中なので、Docker を使用して Redis マスタースレ...

MySQL の日付型の単一行関数コードの詳細な説明

MySQL の日付型単一行関数: CURDATE()またはCURRENT_DATE()は現在の日付を...

ZabbixはLinuxシステムサービスのプロセスを監視

Zabbix は Linux システムのサービス ユニットを監視するためのルールを自動的に検出します...

Node.js でのクラスター作成に関する簡単な説明

目次クラスタクラスターの詳細クラスター内のイベントクラスター内のメソッドクラスター内の属性クラスター...

Flask と Vue のフロントエンドとバックエンドを分離したプロジェクト展開のサンプル コード

以前、プロジェクトを開発しました。バックエンドのインターフェースを書くために Flask フレームワ...