序文当社はこれまで、地図インタラクションに関連する多くの製品システムを開発してきました。現在、中国で主流の地図アプリケーション 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: CentOS 8 カスタム ディレクトリ インストール nginx (チュートリアルの詳細)
ようやく手元のプロジェクトが終了し、行方不明だった人たちが戻ってきました!プロジェクトを進める過程で...
このブログは仕事のメモです環境: nginx バージョン: nginx/1.14.0 Centos ...
以前、写真が与えられ、その写真スタイルに基づいてフォームを作成するという課題に遭遇しました。しかし、...
<本文> <div id="ルート"> <フォー...
システムとユーザー環境の設計<br />Apple システムの成功は、そのシステム アー...
react.js フレームワーク Redux https://github.com/reactjs/...
コードをコピーコードは次のとおりです。 <前> <div> <sele...
スクリプトの要件: MySQL データベースを毎日バックアップし、スクリプトを 7 日間保存します。...
まず、Docker イメージ用の特定のプロジェクト ディレクトリを作成します。例: mkdir /h...
目次1. ファイルを開くパラメータの紹介2. ファイルの読み取り3. ファイルを書き込む4. 閉じる...
序文システム領域の使用量が大きすぎて消去する必要がある場合、または特定のファイルを消去する必要がある...
目次1. プロトタイプモード例1例2例3 2. オブザーバーパターン1. プロトタイプモードプロトタ...
この記事の例では、ミニプログラムのカスタムタブバーコンポーネントをカプセル化するための具体的なコード...
序文良い習慣はすべて宝物です。この記事は、SQL の後悔の治療法、SQL パフォーマンスの最適化、S...
Dockerfile内の指定されたファイルに複数の行を追加します。echoの後の「$」記号に注意し...