xlcs/xlcs-user/pagesLocation/choosePickUpLocation/choosePickUpLocation.vue
2024-01-07 01:10:08 +08:00

175 lines
5.3 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="gg u-p-20">
<!-- 利用.sync修饰符将searchKeyword传递到子组件 -->
<PickUpLocationHeader :searchKeyword.sync="searchKeyword" @getSearchLeader="getSearchLeader"/>
<u-gap height="20"/>
<map id="pickUpLocationMap" :latitude="latitude" :longitude="longitude" :markers="covers" :scale="scale"
class="gg-location-map" show-location @markertap="mapMarkertap"></map>
<view class="gg-location">
<!-- 利用scroll-into-view进行选中提货点的定位操作 -->
<scroll-view :scroll-into-view="`map-${markerId}`" class="gg-location-scroll" scroll-with-animation scroll-y
@scrolltolower="loadMore">
<block v-if="searchResult.content.length > 0">
<view v-for="(item, index) in searchResult.content" :id="`map-${item.id}`" :key="item.id" class="u-m-b-20">
<PickUpLocationItem
:isCurrent="checkIsCurrent(item.id)"
:location="item"
:selected="markerId === item.id"
@selectPickUpLocation="selectPickUpLocation"
></PickUpLocationItem>
</view>
</block>
<u-empty v-else mode="list"></u-empty>
</scroll-view>
</view>
<view class="gg-confirm-pick-up-location">
<u-button type="warning">确认提货点</u-button>
</view>
</view>
</template>
<script>
import {mapState, mapGetters, mapMutations, mapActions} from 'vuex';
export default {
data() {
return {
searchKeyword: '',
filter: {
page: 1, // 当前页码
limit: 5, // 每页记录数
latitude: '', // 经度
longitude: '' // 纬度
},
searchResult: {
content: [],
last: false
},
scale: 12, // 缩放尺寸
markerId: 0, // 当前选中标记
covers: [
{
latitude: 39.909,
longitude: 116.39742,
iconPath: '/static/images/location.png',
width: 30,
height: 30
}
]
};
},
computed: {
...mapState('pickUpLocationModule', ['leaderAddressVo']),
...mapGetters('pickUpLocationModule', ['checkIsCurrent'])
},
methods: {
...mapActions('pickUpLocationModule', ['selectLeaderAddressVoAction']),
async getSearchLeader(data) {
// 查询数据
if (data) {
Object.assign(this.$data.searchResult, this.$options.data().searchResult); // 这里重置 searchResult 下的所有数据
Object.assign(this.$data.filter, this.$options.data().filter); // 这里重置 filter 下的所有数据
}
this.filter.latitude = data ? data.latitude : this.filter.latitude;
this.filter.longitude = data ? data.longitude : this.filter.longitude;
const o = {
limit: this.filter.limit,
page: this.filter.page,
longitude: this.filter.longitude,
latitude: this.filter.latitude
};
let result = await this.$u.api.getSearchLeader(o);
this.searchResult = {...result, content: [...this.searchResult.content, ...result.content]};
// marker标记点的设置
if (this.searchResult.content.length > 0) {
let covers = [];
this.searchResult.content.map(item => {
covers.push({
id: item.id,
latitude: item.location.lat,
longitude: item.location.lon,
iconPath: '/static/images/location.png',
width: 30,
height: 30
});
});
// 需要将查询结果地图上标识
this.covers = covers;
// 先将位置移动到第一个位置
let latitude = this.searchResult.content[0].location.lat;
let longitude = this.searchResult.content[0].location.lon;
this.pickUpLocationMapCtx.moveToLocation({latitude, longitude}); // 移动到该位置
this.scale = 12;
}
},
// 加载更多数据
loadMore() {
if (!this.searchResult.last) {
this.filter.page = this.filter.page + 1;
this.getSearchLeader();
}
},
// 标记点点击操作
mapMarkertap({detail: {markerId}}) {
this.markerId = markerId
},
// 选择提货点
selectPickUpLocation(leaderId) {
this.selectLeaderAddressVoAction({leaderId});
},
},
onReady: function (e) {
this.pickUpLocationMapCtx = uni.createMapContext('pickUpLocationMap');
},
mounted() {
uni.getLocation({
type: 'gcj02',
success: async res => {
this.covers[0]['latitude'] = res.latitude;
this.covers[0]['longitude'] = res.longitude;
// 通过网页接口从经纬度获取地址信息
// 会报Unhandled promise rejection的错误可以利用trycatch在error阶段获取数据
try {
const result = await this.$u.api.getBaiduMapAddress({latitude: res.latitude, longitude: res.longitude});
} catch (error) {
this.searchKeyword = error.result.addressComponent.district + error.result.addressComponent.street;
}
this.pickUpLocationMapCtx.moveToLocation();
}
});
}
};
</script>
<style lang="scss" scoped>
.gg {
display: flex;
flex-direction: column;
/* 地图设置 */
&-location-map {
width: 100%;
height: calc(100vh - 120rpx - 400rpx - 140rpx);
}
/* 滚动区域 */
&-location {
padding: 20rpx 20rpx 20rpx 20rpx;
&-scroll {
height: 400rpx;
}
}
}
</style>