【mapbox】popup挂载自定义组件(Vue3)
基本思路:将创建的vue文件制作成一个app,然后把这个app挂载在页面上的一个div上,再把这个div传给mapbox的popup。
不知道有没有其他影响,目前用着没问题。
1 创建app.vue
里面的内容随意,props用来接收传过来的值。
<script setup lang="ts">
const props = defineProps({
tableData: {
type: Array,
default: () => [
{
attribute: "",
value: "",
},
],
},
title: {
type: String,
default: () => "标题",
},
});
const changeDate = (value: any) => {
};
const changeMode = (value: any) => {
};
const datePicker = ref("");
</script>
<template>
<div class="flex justify-center pb-4 text-xl font-bold text-blue-500">
{{ props.title }}
</div>
<el-table
:data="props.tableData"
:show-header="false"
border
style="width: 100%"
>
<el-table-column prop="attribute" width="180" />
<el-table-column prop="value" min-width="200" />
</el-table>
</template>
<style scoped lang="scss"></style>
2 挂载组件到界面上
{ title: title, tableData: data }是传到props的值。
import pop from "./app.vue";
import { createApp } from "vue";
import ElementPlus from "element-plus";
export function creatTablePopup(title: string, data: any) {
const app = createApp(pop, { title: title, tableData: data }).use(
ElementPlus
); // 因为我在app.vue里面用到了element-plus的内容,所以在这里要use一下,不然找不到
app.config.warnHandler = () => null; // 控制台不输出警告
const parent = document.createElement("div");
const container = document.getElementById("app");
container?.appendChild(parent);
const instance = app.mount(parent);
return parent;
}
参考别人原来是这么写的。
但是vue3没有extend了,所以找了一下实现方法,像上面那样写基本满足我目前的需求。
const p = Vue.extend(pop); //Popup 是一个单独的模板页面 。自定义
let vm = new p({
propsData: {
PopObj: data, //要传输的数据对象
}, //传参
});
vm.$mount(); //挂载
return vm.$el;
3 传给popup使用
与之前创建div的区别在于 setDOMContent() 函数,之前使用的是 setHTML() 函数,好多东西不好控制。
const popup = new mapboxgl.Popup({maxWidth: "500"})
popup.setDOMContent(dom)
.setLngLat(e.lngLat)
.addTo(map)
参考:
https://www.jianshu.com/p/9e68e081ab3b
https://blog.csdn.net/qq_14993591/article/details/128235075