Apabila kami menggunakan Amap, pegawai mengesyorkan banyak kes kepada kami, demo
, tetapi kes ini semuanya menggunakan kaedah asli untuk mengakses dan tidak memberikan vue
atau react
daripada demo
tentang akses vue2
ke Internet Dalam artikel ini, mari kita lihat vue3
dan cara menggunakan Amap api
yang biasa digunakan.
Sebelum pembangunan kita perlu memahami beberapa aspek mengakses Amap dalam
vue3
Langkah
npm i @amap/amap-jsapi-loader --save
import AMapLoader from '@amap/amap-jsapi-loader'
Gunakan kaedah pengenalan rasmi Terdapat perbezaan antara menambah
vue2
dan vue3
Di sini kami menggunakan vue3
, tetapi kaedah vue3
di sini masih pilihan tidak digabungkan. Apabila saya menulisnya sendiri, saya menggunakan jenis gabungan dan bersepadu ts
Apabila saya menerbitkan fail .vue
yang lengkap nanti, saya akan mengeluarkan ts pada tag kerana jenisnya belum lengkap dan akan diperbaiki kemudian. . Anda perlu menyiarkan perubahan kemudian. Mengapa menggunakan shallowRef
? [Cadangan berkaitan: tutorial video vuejs, pembangunan bahagian hadapan web]
Di sini Saya akan terus saya mengambil logik perniagaan keperluan perniagaan peta yang saya tulis sebelum ini dan memperkenalkannya terus ke dalam fail html tanpa menggunakan rangka kerja Anda boleh klik pada pautan di bawah untuk melihat:
Penggunaan Amap jsApi.
Konfigurasi titik dan garis Amap jsApi
Tetapan klik kanan Amap jsApi
Kedudukan titik baharu Amap jsApi Ditambah
Amap jsApi legend
Apabila menggunakanvue3
, kaedah instantiasi, masalahthis
dan tindak balas acara apabila memasukkan templat rentetan Kaedah ini perlu ditukar, yang masih sangat menyusahkan
plugins
加载插件, 其他配置如 Loca
, 直接进行配置, 这里需要注意版本问题, 写成 ‘2.0’ 是不行的,初始化函数在 onmounted
生命周期中执行。.value
的语法是 vue3
获取 ref
的语法,我下面使用到的 都是ref
,后面完整代码可以查看, 这里挂载的时候直接存一下,因为很多工具方法都会只用到他,这里后期业务逻辑我会抽离到 pinia
中去,所以不需要在初始化函数中写全部的业务逻辑。content
字符串模版,替换点样式,这里有两种方案修改样式,一种是 插入 DOM
,不使用字符串,然后在 DOM
上通过 style
直接修改样式,另一种就是使用模版的时候直接给 class
类名,但是这种样式如果我们给 vue
的 style
加了 scoped
就不会生效,这里大家可以自己灵活选择用哪种,我这里暂时先使用模版的方式,去掉了 scoped
。import AMapLoader from '@amap/amap-jsapi-loader' const initMap = () => { AMapLoader.load({ key: 'b59c490f61a694b9d7576dd864f74d6e', // 申请好的Web端开发者Key,首次调用 load 时必填 version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15 plugins: ['AMap.Scale', 'AMap.ToolBar', 'AMap.MouseTool'], // 需要使用的的插件列表,如比例尺'AMap.Scale'等 Loca:{ version:'2.0.0' } }) .then((res) => { AMap.value = res // 上来就显示的中心点 北京 116.397, 39.918 var lnglat = new res.LngLat(105, 38) map.value = new res.Map('container', { //设置地图容器id viewMode: '3D', //是否为3D地图模式 zoom: 5, //初始化地图级别 center: lnglat, //初始化地图中心点位置 }) map.value.clearMap() // 清除地图覆盖物 // 地图是否可拖拽和缩放 map.value.setStatus({ dragEnable: true, // 是否可拖拽 zoomEnable: true, // 是否可缩放 }) initWindow() // 添加一些分布不均的点到地图上,地图上添加三个点标记,作为参照 coordData.forEach(function (marker) { setMarker(marker) }) let renderLine = setLine(coordData) // 设置线 let polyline = renderLine.reduce((prev, item, index) => { let weight = item.type === 1 ? 5 : 3 let color = item.type === 1 ? headColors[0] : headColors[1] prev.push(setLines(item.current, color, weight)) return prev }, []) map.value.add([...polyline]) // 绘制线 //创建右键菜单 menuInstance.value = new ContextMenu(map.value) let loca = new Loca.Container({ map:map.value, }); window._loca = loca; // 图例, 图例可以实例化多个,使用定位来设置位置 let lengend = new Loca.Legend({ loca: loca, title: { label: '管道类型', fontColor: 'rgba(255,255,255,1)', fontSize: '16px' }, style: { backgroundColor: 'rgba(255,255,255,0.2)', left: '20px', bottom: '40px', fontSize: '12px' }, dataMap: [ { label: '省级管道', color: headColors[1] }, { label: '县级管道', color: headColors[0] }, ], }); //修改图例排列方式 document.getElementsByClassName("amap-loca loca-controls")[0].setAttribute('id', 'testid') var lis = document.querySelectorAll("#testid li"); for (var i = 0; i < lis.length; i++) { console.log(lis[i]); lis[i].setAttribute("class", 'test' ); } }) .catch((e) => { console.log('error', e) }) } onMounted(() => { initMap() })
右键菜单, 右键菜单这里官方给我们的示例是使用一个 函数 进行实例化,里面使用了
this
, 所以这个我单独拿出来,首先我们看一下官方的 demo
this
,实话来讲,这种写法确实不是很优秀,可扩展性很差,不够健壮,但没办法,谁让我们用了人家的东西呢是吧, 在 vue3
中这么用就不可以了,首先 vue3
里面使用 this
就不是官方建议的, 另外这里面还修改了函数原型上的方法,其实我得代码里面一共有两种右键菜单,如下:
一种是在指定点位上打开,另一种是在非点位的空白处打开,指定点位处打开的其实叫信息窗体,只不过是通过右键的方式触发,那个没有上面这个右键菜单麻烦。
this
问题, 这里的 this
实际上就是把我们的实例化对象挂载到上面而已,vue3
中没办法像 vue2
那样使用 this
, 但也提供给我们了 api
来获取当前组件的实例化对象, 然后我没用使用函数, 使用了一个类,类构造这个方法, 模版也不适用字符串模版,因为这里字符串模版的事件绑定写死了,我们使用 DOM
来动态绑定事件,代码如下:const { ctx } = getCurrentInstance() const _this = ctx //自定义菜单类 class ContextMenu { constructor(map) { var me = _this //地图中添加鼠标工具MouseTool插件 _this.mouseTool = new AMap.value.MouseTool(map) _this.contextMenuPositon = null const fragment = document.createElement('div') // 使用 DOM 方式, 方便添加事件 fragment.className = 'info context_menu' const p = document.createElement('p') p.addEventListener('click', this.delMarkerMenu) p.textContent = '移除上次选中信息' fragment.appendChild(p) //通过content自定义右键菜单内容 _this.contextMenu = new AMap.value.ContextMenu({ isCustom: true, content: fragment, }) //地图绑定鼠标右击事件——弹出右键菜单 map.on('rightclick', function (e) { me.contextMenu.open(map, e.lnglat) me.contextMenuPositon = e.lnglat //右键菜单位置 }) } delMarkerMenu() { // 右键菜单上次选中点的信息 clearPoint() _this.mouseTool.close() _this.contextMenu.close() } }
添加选点请输入坐标
data
中的一组假数据,在这里给大家两组看一下export const coordData = [ { name: '黑龙江', position: [127, 47], pointData: { out: 100, provide: 10, }, line: [ { current: [ [127, 47], [126, 43], ], type: 1, }, ], }, { name: '吉林', position: [126, 43], pointData: { out: 120, provide: 11, }, line: [ { current: [ [126, 43], [113, 41], ], type: 1, }, ], }, ]
pinia
中, 并且完善ts
类型, 大家对哪一部分有疑问或者更好的解决方案可以留言一起学习~Atas ialah kandungan terperinci Mari kita bincangkan tentang cara menggunakan API Amap dalam vue3. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!