mapbox的popup里使用vue组件

贴个群号

WebGIS学习交流群461555818,欢迎大家。

问题

在mapbox官网中,他的popup实例是这样的

var popup = new mapboxgl.Popup({offset: popupOffsets, className: 'my-class'})
  .setLngLat(e.lngLat)
  .setHTML("<h1>Hello World!</h1>")
  .setMaxWidth("300px")
  .addTo(map);

可以看到他的popup里面的内容,只能是原生的html,那些标签是可以写style的,是可以影响他的。

class是不会生效的,除非将class写在APP.Vue里面。

但是如果我们想要每个图层都添加一种popup,而且图层数量很多,显示内容不同的话,这样硬写不是可取的,还是应该使用vue组件,只不过要把vue组件包在这个popup里面。

操作

要注意的是,直接将组件和上面例子一样写在里面是没用的,他只支持原生的html,说白了,他的popup加载的方式,是mapbox添加到dom的,并不是vue编译进去的。

如果您尝试在弹出内容中使用Vue指令,则弹出窗口可能会有些棘手

下面是我的操作,先引入组件,注意要引入vue实例

import Vue from 'vue'

import BaseDetail from '@/views/detailData/BaseDetail.vue' //我想要塞进popup里面的一个组件,该组件负责展示一下点的详细信息
const BaseDetailItem = Vue.extend(BaseDetail) // 利用vue.extend 生成一个该组件的构造器

然后在调用处,给他一个唯一的id

popupHTML = '<div id="base-detail"></div>'      //这里是我们的popup内容,注意这里面只放一个有id的div

然后我们生成popup

 this.popup
   .setLngLat(lngLat)
   .setHTML(popupHTML)
   .setMaxWidth('none')
   .addTo(this.map)

然后将组件内容挂载到这个id下面,相当于利用这个组件替换了上面有这个id的div内容

  new BaseDetailItem({
    propsData: {
      detailId: this.detailId
    }
  }).$mount('#base-detail')

这里需要注意,propsData是关键字应该,不是我要传下去的值,我要传下去的值是detailId,在组件内接收的也是detailId,组件内部是这样只接收了这个detailId,这个你们自己想要接收什么就接受什么,我这里只是我的演示

  props: ['detailId'],

成果

可以看到,我已经成功的将我的vue组件,搞在了这个mapbox的popup内容里面去了
在这里插入图片描述

参考网站

https://tech.beyondtracks.com/posts/mapbox-gl-popups-with-vue/
https://github.com/phegman/vue-mapbox-gl#popups

在飞渡地图中使用 Vue 组件作为 DtsMarker 的弹窗,可以通过将 Vue 组件渲染为 DOM 元素,并将其绑定到地图标记的弹窗内容中来实现。这一过程与 Mapbox使用 Vue 组件作为弹窗内容的方式类似。 首先,需要创建一个 Vue 组件用于弹窗内容。例如,定义一个名为 `PopupContent.vue` 的组件,其中包含弹窗所需的 HTML 结构和数据绑定逻辑: ```vue <template> <div class="popup-content"> <h3>{{ title }}</h3> <p>{{ description }}</p> </div> </template> <script> export default { props: ['title', 'description'] } </script> <style scoped> .popup-content { padding: 10px; background-color: #fff; border: 1px solid #ccc; border-radius: 4px; } </style> ``` 接着,在地图初始化之后,创建一个 DtsMarker 实例,并将其与 Vue 组件结合。在创建弹窗时,使用 Vue 的 `h` 函数(或 `createElement`)将组件渲染为真实的 DOM 节点,并作为弹窗内容传入: ```javascript import { createApp, h } from 'vue' import PopupContent from './components/PopupContent.vue' // 假设已经初始化了飞渡地图 const viewer = new Cesium.Viewer('cesiumContainer') // 创建 Vue 应用实例 const popupApp = createApp({ render() { return h(PopupContent, { props: { title: '示例标题', description: '这是一个使用 Vue 组件的弹窗内容' } }) } }) // 挂载 Vue 应用到一个临时 DOM 元素 const popupElement = document.createElement('div') popupApp.mount(popupElement) // 创建 DtsMarker 并绑定弹窗 const marker = new DtsMarker({ position: { lng: 116.4, lat: 39.9 }, popupContent: popupElement.innerHTML // 将 Vue 渲染后的内容作为弹窗内容 }) // 将标记添加到地图上 viewer.entities.add(marker) ``` 上述代码展示了如何将 Vue 组件渲染为 HTML 字符串,并将其设置为 DtsMarker 的弹窗内容。需要注意的是,实际使用时应确保 Vue 组件的生命周期与地图交互同步,并处理好组件与地图之间的通信机制。 如果飞渡地图支持自定义 DOM 元素作为弹窗内容,则可以直接将 Vue 组件实例挂载到该元素上[^2]。此外,还需要考虑 Vue 组件样式的作用域问题,确保其样式不会影响到地图的其他部分。
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值