高德地图使用vue组件自定义infoWindow信息窗口

项目背景

在使用高德地图做地图相关开发时,经常会使用到标记点marker功能,如果业务较复杂,标记点需要增加自定义的信息窗口infoWindow,自定义信息窗口支持传入content参数,content 可以是 dom 对象,也可以是 html 识别的字符串。

自定义最大的问题就是事件不好处理,比如关闭信息窗的点击事件。在官方的示例中,自定义使用的原生dom节点创建并添加事件,对于复杂场景,这样操作就显得较为复杂,可读性和拓展性都很差。这里可以使用es6的模板语法做html字符串拼接,把需要绑定事件的元素设置ID,在创建信息窗后,通过addEventListener进行点击事件绑定。

在更复杂的业务场景中,es6的模板语法显得力不从心,比如我想使用element-ui组件,自定义的svg图标组件。为了更灵活的进行信息窗自定义,我们可以选择使用vue组件作为自定义信息窗的content。首先我们要理清逻辑,假如有多个标记点,信息窗是在标记点被点击后显示,那么我们就在标记点上添加一个点击事件,点击时,创建信息窗并显示。而不要在创建标记点时就把信息窗创建了。下面是伪代码:

伪代码

// 父组件
<template>
    <div class="container">
        <div v-loading="mapLoading" class="wrap">
            <div id="container" style="width: 100%; height: 100%"></div>
			<!-- 自定义组件InfoWindow,初始时需要隐藏 -->
            <!-- 隐藏不要使用v-if,因为我们需要渲染完成后的原生html结构作为信息框的dom对象使用 -->
            <InfoWindow v-show="showInfoWindow" ref="infoWindow" :info-window="infoWindow"></InfoWindow>
        </div>
    </div>
</template>

<script>
  //引入定义的信息窗组件
  import InfoWindow from './components/InfoWindow'

  export default {
    components: {
      // 注册组件
      InfoWindow,
    },
    data() {
      return {
        // 组件加载后隐藏
        showInfoWindow: false,
        infoWindow: {}
      }
    },
    methods: {
      addMarker() {
          // 创建标记点Marker
          let labelMarker = new this.AMap.LabelMarker({
              icon: 'icon路径',
              position: 'position定位点'
          })
          // labelMarker都绑定上点击事件
          labelMarker.on('click', (e) => {
              // 点击后创建自定义信息窗口
              this.setInfoWindows(title, content, e)
              // 把地图中心点设置为当前点击的标记点
              this.map.setZoomAndCenter(this.zoom, item.position)
          })
      },
      setInfoWindows(title, content, e) {
          // 此时需要把组件的样式设置为可见
          this.showInfoWindow = true
          // 设置marker头部的标题信息窗口
          const infoWindow = new this.AMap.InfoWindow({
              // 使用自定义窗体
              isCustom: true,
              // 只有当组件渲染完毕后,通过$el才能拿到原生的dom对象
              content: this.$refs['infoWindow'].$el, 
              // 设置定位偏移量
              offset: new this.AMap.Pixel(-9, -60)
          })
          this.infoWindow = infoWindow
          // 信息窗口打开
          infoWindow.open(this.map, e.target.getPosition())
       }
    }
  }
</script>
// 信息窗口子组件

<template>
  <div>
    <el-card class="box-card" style="padding: 0 80 30 80;width: 400px;border-radius: 10px;">
      <div id="del-div">
        <el-link type="primary" icon="el-icon-close" @click="close()"></el-link>
      </div>
      <div style="text-align: center;">
        <el-button type="primary">主要按钮</el-button>
      </div>
  </div>
</template>
<script>
export default {
    props: {
        infoWindow: {
            type: Object,
            default: () => {}
        },
    },
    methods: {
    // 关闭
        close() {
            // 高德地图信息窗关闭的api
            this.infoWindow.close()
        },
        edit() {
            console.log('编辑按钮测试')
        },
        del() {
            console.log('删除按钮测试')
        }
    }
}
</script>
 
<style lang="css" scoped>
#del-div {
  position: absolute;
  right: 20;
  top: 20;
  transform: scale(1.2);
}
</style>

把信息窗口封装成vue组件后,灵活性更强,其它组件都可以在里面使用。但是要注意,上面都是伪代码,需要理解后根据实际业务把代码加进去。

参考博客:

vue 高德地图api爬坑之路(四) 自定义infoWindow信息窗体

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
使用高德地图API和Vue3实现自定义弹窗样式时,可以参考以下步骤: 1. 首先,初始化地图弹窗实例,并设置isCustom为true,表示使用自定义窗体。可以使用AMap.InfoWindow类来创建地图弹窗实例,并设置偏移量等属性。\[1\] 2. 在处理地图标记物点击事件时,可以通过获取点击的标记物对象,设置动画效果,并获取相应的内容。可以使用AMap.InfoWindow的setContent方法设置弹窗内容,然后使用open方法打开弹窗。\[1\] 3. 可以参考高德地图官方提供的demo样式,该demo展示了自定义弹窗的样式。可以在官方demo中查看代码和样式,以便参考和使用。\[2\] 4. 高德地图官网还提供了自定义弹窗内容的例子,使用了Dom操作的方式来实现。可以使用Vue的全局API中的Vue.extend方法来创建一个Vue子类构造器,然后通过实例化该构造器来创建一个Vue对象,类似于Dom中的DocumentFragment接口。这样可以使用Vue的方式来实现自定义弹窗的Dom操作。\[3\] 综上所述,你可以使用高德地图API和Vue3来实现自定义弹窗样式。可以参考高德地图官方提供的demo和文档,根据自己的需求进行相应的代码编写和样式设计。 #### 引用[.reference_title] - *1* *3* [高德地图自定义弹窗内容](https://blog.csdn.net/fredricen/article/details/106172766)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [VUE 高德自定义弹窗样式不生效?(AMap.InfoWindow弹窗样式问题)](https://blog.csdn.net/weixin_39921970/article/details/120744647)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值