此应用程序是使用Ionic Framework和 Vue JS 构建的。我们只为 UI 组件使用 Ionic Framework,这些组件可以替换为任何 vue js 兼容的 UI 组件
主页.vue
脚本部分:
导入:
我们首先导入必要的依赖项和组件。我们从包中导入 Ionic 框架组件@ionic/vue
,并使用 vue 包访问 ref 函数,这使我们能够创建反应式引用。此外,我们还从其他文件导入两个自定义组件MyMap
和。MarkerInfoWindow
最后,我们从 Capacitor 框架导入Capacitor
,该框架用于构建跨平台应用程序。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">import</span> <span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-name-color)">IonContent</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-name-color)">IonHeader</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-name-color)">IonPage</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-name-color)">IonTitle</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-name-color)">IonToolbar</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-name-color)">IonPopover</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-name-color)">modalController</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-text-color)">}</span> <span style="color:var(--syntax-declaration-color)">from</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">@ionic/vue</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">import</span> <span style="color:var(--syntax-text-color)">{</span> <span style="color:var(--syntax-name-color)">ref</span> <span style="color:var(--syntax-text-color)">}</span> <span style="color:var(--syntax-declaration-color)">from</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">vue</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">import</span> <span style="color:var(--syntax-name-color)">MyMap</span> <span style="color:var(--syntax-declaration-color)">from</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">./MyMap.vue</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">import</span> <span style="color:var(--syntax-name-color)">MarkerInfoWindow</span> <span style="color:var(--syntax-declaration-color)">from</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">../components/MarkerInfoWindow.vue</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">;</span>
<span style="color:var(--syntax-declaration-color)">import</span> <span style="color:var(--syntax-text-color)">{</span> <span style="color:var(--syntax-name-color)">Capacitor</span> <span style="color:var(--syntax-text-color)">}</span> <span style="color:var(--syntax-declaration-color)">from</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">@capacitor/core</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">;</span>
</code></span></span>
变量声明:
我们声明两个反应性引用变量:markerInfo
和markerIsOpen
。这些变量将分别保存有关当前所选标记以及标记弹出框是打开还是关闭的信息。
我们定义一个名为 的数组markerData
,用于保存地图上标记的样本数据。每个标记对象由coordinates
(纬度和经度)、 atitle
和 a组成snippet
。您可以根据需要添加更多标记来自定义此数据。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">markerInfo</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-name-color)">ref</span><span style="color:var(--syntax-error-color)"><</span><span style="color:var(--syntax-name-color)">any</span><span style="color:var(--syntax-error-color)">></span><span style="color:var(--syntax-text-color)">();</span>
<span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">markerIsOpen</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-name-color)">ref</span><span style="color:var(--syntax-error-color)"><</span><span style="color:var(--syntax-name-color)">boolean</span><span style="color:var(--syntax-error-color)">></span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-declaration-color)">false</span><span style="color:var(--syntax-text-color)">);</span>
<span style="color:var(--syntax-comment-color)">// sample data for the map</span>
<span style="color:var(--syntax-declaration-color)">const</span> <span style="color:var(--syntax-name-color)">markerData</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">[</span>
<span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-name-color)">coordinate</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-text-color)">{</span> <span style="color:var(--syntax-name-color)">lat</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">37.769</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-name-color)">lng</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-error-color)">-</span><span style="color:var(--syntax-literal-color)">122.446</span> <span style="color:var(--syntax-text-color)">},</span>
<span style="color:var(--syntax-name-color)">title</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">title one</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-name-color)">snippet</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">title one snippet content will be presented here</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-text-color)">},</span>
<span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-name-color)">coordinate</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-text-color)">{</span> <span style="color:var(--syntax-name-color)">lat</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">37.774</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-name-color)">lng</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-error-color)">-</span><span style="color:var(--syntax-literal-color)">122.434</span> <span style="color:var(--syntax-text-color)">},</span>
<span style="color:var(--syntax-name-color)">title</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">title two</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-name-color)">snippet</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">title two snippet content will be presented here</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-text-color)">},</span>
<span style="color:var(--syntax-text-color)">{</span>
<span style="color:var(--syntax-name-color)">coordinate</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-text-color)">{</span> <span style="color:var(--syntax-name-color)">lat</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">37.783</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-name-color)">lng</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-error-color)">-</span><span style="color:var(--syntax-literal-color)">122.408</span> <span style="color:var(--syntax-text-color)">},</span>
<span style="color:var(--syntax-name-color)">title</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">title three</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-name-color)">snippet</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">title three snippet content will be presented here</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-text-color)">},</span>
<span style="color:var(--syntax-comment-color)">// Add more points as needed</span>
<span style="color:var(--syntax-text-color)">];</span>
</code></span></span>
功能:
openModal
是单击标记时的事件处理程序。它使用创建并呈现一个模式窗口modalController.create()
。模式显示MarkerInfoWindow
组件,其中显示有关 的详细信息marker
。
mapClicked
是单击地图时的事件侦听器。它只是将一条消息记录到控制台,允许您在单击地图时执行任何所需的操作。
getMarkerInfo
将marker
对象作为输入并返回数组中的关联信息markerData
。此函数用于在单击标记时检索标记信息。
markerClicked
是单击标记时的事件处理程序。它使用Capacitor.isNativePlatform()
. 如果它不是原生的,它调用函数openModal
以模态显示标记信息。这种区别是必要的,因为网络版本不会直接在地图上显示信息窗口。