182 lines
3.8 KiB
Markdown
182 lines
3.8 KiB
Markdown
# MapLocation 地图定位组件
|
||
|
||
一个可复用的地图定位组件,集成了地址输入、位置获取、地图打开等功能。
|
||
|
||
## 功能特性
|
||
|
||
- 📍 自动获取当前位置
|
||
- 🗺️ 一键打开系统地图
|
||
- 📝 支持手动输入地址
|
||
- 📱 跨平台支持(APP、微信小程序、H5)
|
||
- 🎨 美观的UI设计
|
||
- 🔧 高度可配置
|
||
|
||
## 使用方法
|
||
|
||
### 基础用法
|
||
|
||
```vue
|
||
<template>
|
||
<map-location
|
||
v-model="address"
|
||
label="地址"
|
||
placeholder="请输入或选择收货地址"
|
||
/>
|
||
</template>
|
||
|
||
<script>
|
||
import MapLocation from '@/components/map-location/map-location.vue'
|
||
|
||
export default {
|
||
components: {
|
||
MapLocation
|
||
},
|
||
data() {
|
||
return {
|
||
address: ''
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
```
|
||
|
||
### 完整用法
|
||
|
||
```vue
|
||
<template>
|
||
<map-location
|
||
v-model="formData.address"
|
||
label="收货地址"
|
||
placeholder="请输入或选择收货地址"
|
||
@location-success="onLocationSuccess"
|
||
@location-error="onLocationError"
|
||
@use-location="onUseLocation"
|
||
@map-opened="onMapOpened"
|
||
@address-focus="onAddressFocus"
|
||
@address-input="onAddressInput"
|
||
/>
|
||
</template>
|
||
|
||
<script>
|
||
import MapLocation from '@/components/map-location/map-location.vue'
|
||
|
||
export default {
|
||
components: {
|
||
MapLocation
|
||
},
|
||
data() {
|
||
return {
|
||
formData: {
|
||
address: ''
|
||
}
|
||
}
|
||
},
|
||
methods: {
|
||
// 位置获取成功
|
||
onLocationSuccess(location) {
|
||
console.log('位置获取成功:', location)
|
||
// location 包含: { address, latitude, longitude }
|
||
},
|
||
|
||
// 位置获取失败
|
||
onLocationError(error) {
|
||
console.error('位置获取失败:', error)
|
||
},
|
||
|
||
// 使用位置
|
||
onUseLocation(location) {
|
||
console.log('使用位置:', location)
|
||
},
|
||
|
||
// 地图打开成功
|
||
onMapOpened() {
|
||
console.log('地图已打开')
|
||
},
|
||
|
||
// 地址输入框获得焦点
|
||
onAddressFocus() {
|
||
console.log('地址输入框获得焦点')
|
||
},
|
||
|
||
// 地址输入
|
||
onAddressInput(value) {
|
||
console.log('地址输入:', value)
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
```
|
||
|
||
## Props 属性
|
||
|
||
| 属性名 | 类型 | 默认值 | 说明 |
|
||
|--------|------|--------|------|
|
||
| label | String | '地址' | 表单标签 |
|
||
| placeholder | String | '请输入或选择收货地址' | 输入框占位符 |
|
||
| value | String | '' | 地址值(支持v-model) |
|
||
| showLocationCard | Boolean | true | 是否显示位置建议卡片 |
|
||
|
||
## Events 事件
|
||
|
||
| 事件名 | 参数 | 说明 |
|
||
|--------|------|------|
|
||
| input | String | 地址值变化时触发 |
|
||
| location-success | Object | 位置获取成功时触发 |
|
||
| location-error | Error | 位置获取失败时触发 |
|
||
| use-location | Object | 点击使用位置时触发 |
|
||
| map-opened | - | 地图打开成功时触发 |
|
||
| address-focus | - | 地址输入框获得焦点时触发 |
|
||
| address-input | String | 地址输入时触发 |
|
||
|
||
## 位置对象结构
|
||
|
||
```javascript
|
||
{
|
||
address: "纬度: 39.123456, 经度: 116.123456",
|
||
latitude: 39.123456,
|
||
longitude: 116.123456
|
||
}
|
||
```
|
||
|
||
## 方法
|
||
|
||
组件提供了以下方法供外部调用:
|
||
|
||
### setLocation(location)
|
||
手动设置位置信息
|
||
|
||
```javascript
|
||
// 在父组件中调用
|
||
this.$refs.mapLocation.setLocation({
|
||
address: '北京市朝阳区',
|
||
latitude: 39.123456,
|
||
longitude: 116.123456
|
||
})
|
||
```
|
||
|
||
### clearLocation()
|
||
清空位置信息
|
||
|
||
```javascript
|
||
// 在父组件中调用
|
||
this.$refs.mapLocation.clearLocation()
|
||
```
|
||
|
||
## 平台支持
|
||
|
||
- ✅ APP-PLUS:使用系统地图应用
|
||
- ✅ MP-WEIXIN:使用微信小程序地图
|
||
- ✅ H5:使用高德地图在线版
|
||
|
||
## 依赖
|
||
|
||
- `@/utils/permission.js`:权限处理工具
|
||
- uni-app 定位API
|
||
- uni-app 地图API
|
||
|
||
## 注意事项
|
||
|
||
1. 首次使用需要用户授权定位权限
|
||
2. 不同平台的权限处理可能略有差异
|
||
3. H5环境下需要网络连接才能使用地图功能
|
||
4. 建议在真机上测试定位功能 |