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

推薦する

モバイルウェブページのサイズ調整を実装する方法

ようやく手元のプロジェクトが終了し、行方不明だった人たちが戻ってきました!プロジェクトを進める過程で...

geoip を使用して nginx で地域を制限する方法

このブログは仕事のメモです環境: nginx バージョン: nginx/1.14.0 Centos ...

HTML でフォームを中央揃えにする

以前、写真が与えられ、その写真スタイルに基づいてフォームを作成するという課題に遭遇しました。しかし、...

ユーザーエクスペリエンスの要素またはWebデザインの要素

システムとユーザー環境の設計<br />Apple システムの成功は、そのシステム アー...

React.js フレームワーク Redux 基本ケースの詳細な説明

react.js フレームワーク Redux https://github.com/reactjs/...

新しいウィンドウで開くジャンプメニュー、window.open の使い方の紹介

コードをコピーコードは次のとおりです。 <前> <div> <sele...

mysql バックアップ スクリプトを作成し、7 日間保存します。

スクリプトの要件: MySQL データベースを毎日バックアップし、スクリプトを 7 日間保存します。...

Docker で Python スクリプトを実行する方法

まず、Docker イメージ用の特定のプロジェクト ディレクトリを作成します。例: mkdir /h...

ファイル操作のためのLinuxシステムコール

目次1. ファイルを開くパラメータの紹介2. ファイルの読み取り3. ファイルを書き込む4. 閉じる...

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

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

Javascript デザインパターン プロトタイプ モードの詳細

目次1. プロトタイプモード例1例2例3 2. オブザーバーパターン1. プロトタイプモードプロトタ...

ミニプログラムカスタムタブバーコンポーネントのカプセル化

この記事の例では、ミニプログラムのカスタムタブバーコンポーネントをカプセル化するための具体的なコード...

21 の MySQL 標準化および最適化のベスト プラクティス!

序文良い習慣はすべて宝物です。この記事は、SQL の後悔の治療法、SQL パフォーマンスの最適化、S...

Dockerfile echoは、指定されたファイル内の複数行のテキストを実装する方法を指定します。

Dockerfile内の指定されたファイルに複数の行を追加します。echoの後の「$」記号に注意し...