H5-ThreeDoorder/components/linzq-citySelect/linzq-citySelect.vue

508 lines
11 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>
<div class="wrapper" :style="'top:'+statusBarHeight+'px'">
<div class="header">
<view class="back_div" v-if="inputActive">
<!-- <image class="back_img" @click="back_city()" src="" mode=""></image> -->
<image class="back_img" @click="back_city()" src="https://img.agrimedia.cn/refresh.png" mode=""></image>
</view>
<input :class="inputActive? 'input':'input inputActive'" @input="onInput" placeholder="搜索城市名" v-model="searchValue" />
</div>
<scroll-view class="calendar-list" scroll-y="true" :scroll-into-view="scrollIntoId">
<view v-if="disdingwei" id="hot">
<!-- 定位模块 -->
<view class="dingwei">
<view class="dingwei_Tips">
当前城市
</view>
<view class="dingwei_city">
<view class="dingwei_city_one">
{{getCityName}}
</view>
<view class="dingweis_div" @click="getWarpweft">
<image class="dingweis" src="https://img.agrimedia.cn/refresh.png" mode=""></image>
<!-- <text>{{po_tips}}</text> -->
</view>
</view>
</view>
<!-- 最近模块 -->
<view class="dingwei" v-if="Visit.length>=0">
<view class="dingwei_Tips">
最近搜索
</view>
<view class="dingwei_city dingwei_city_zuijin">
<view class="dingwei_city_one toright" v-for="(item,index) in Visit" :key="index" v-if="index<2" @click="back_city(item)">
{{item.cityName}}
</view>
</view>
</view>
</view>
<!-- 城市列表 -->
<view v-if="searchValue == ''" v-for="(item, index) in list" :id="getId(index)" :key="index">
<view class="letter-header">{{ getId(index) }}</view>
<view class="city-div" v-for="(city, i) in item" :key="i" @click="back_city(city)">
<text class="city">{{ city.cityName }}</text>
</view>
</view>
<!-- 搜索结果 -->
<view class="city-div" v-for="(item, index) in searchList" :key="index" @click="back_city(item)">
<text class="city">{{ item.cityName }}</text>
</view>
</scroll-view>
<!-- 右侧字母 -->
<view class="letters" v-if="searchValue == ''">
<!-- <view class="letters-item" @click="scrollTo('hot')">最近</view> -->
<view class="letters-item" v-for="item in letter" :key="item" @click="scrollTo(item)">{{ item }}</view>
</view>
<!-- 选中之后字母 -->
<view class="mask" v-if="showMask">
<view class="mask-r">{{selectLetter}}</view>
</view>
</div>
</template>
<script>
let qqMap = require("@/utils/qqmap-wx-jssdk.min.js");
import { cityList} from '@/common/api/api.js'
import { mapGetters} from 'vuex'
import Citys from '../city.js';
export default {
components: {},
props: {},
computed: {
...mapGetters({
getCityName:'location/getCityName'
})
},
data() {
return {
statusBarHeight: this.statusBarHeight,
ImgUrl: this.ImgUrl,
letter: [],
selectLetter: '',
searchValue: '',
scrollIntoId: '',
list: [],
tId: null,
searchList: [],
showMask: false,
disdingwei: true,
Visit: [], //最近访问
position: '',
longitude: '', //经度
latitude: '', //纬度
seconds: 3,
po_tips: '重新定位',
citys:[],
hotCity:[],
inputActive: true
}
},
created() {
cityList().then(data=>{
this['citys'] = data['cities'];
this['hotCity'] = data['hotCity'];
//获取存储的最近访问
var that = this
uni.getStorage({
key: 'Visit_key',
success: function(res) {
that.Visit = res.data
}
});
// this.position = this['getCityName'];
//获取定位 经度纬度
// that.getWarpweft()
//获取city.js 的程序字母
var mu = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'w', 'x', 'y',
'z'
];
var tmp = [];
for (var i = 0; i < mu.length; i++) {
var item = mu[i];
for (var j = 0; j < this.citys.length; j++) {
var py = this.citys[j].py;
if (py.substring(0, 1) == item) {
if (tmp.indexOf(item) == -1) {
this.list[i] = [this.citys[j]];
tmp.push(item);
this.letter.push(item.toUpperCase());
} else {
this.list[i].push(this.citys[j]);
}
}
}
}
console.log(this.citys)
})
},
methods: {
getId(index) {
return this.letter[index];
},
scrollTo(letter) {
this.showMask = true
this.selectLetter = letter == 'hot' ? '最' : letter
setTimeout(() => {
this.showMask = false
}, 300);
this.scrollIntoId = letter;
},
query(source, text) {
let res = [];
var self = this;
res = source.filter(item => {
const arr = [];
let isHave = false;
Object.keys(item).forEach(prop => {
const itemStr = item[prop];
self.isString(itemStr) &&
itemStr.split(',').forEach(val => {
arr.push(val);
});
});
arr.some(val => {
isHave = new RegExp('^' + text).test(val);
return isHave;
});
return isHave;
});
console.log(JSON.stringify(res));
return res;
},
isString(obj) {
return typeof obj === 'string';
},
onInput(e) {
const value = e.target.value;
console.log(value);
if (value !== '' && this.citys && this.citys.length > 0) {
const queryData = this.query(this.citys, String(value).trim());
this.searchList = queryData;
this.disdingwei = false;
this.inputActive = false;
} else {
this.searchList = [];
this.disdingwei = true;
this.inputActive = true;
}
},
back_city(item) {
if (item) {
//unshift 把数据插入到首位与push相反
console.log(this.Visit,'visit')
if(this.Visit == null){
this.Visit = []
}
this.Visit.unshift(item)
this.searchValue = "";
this.disdingwei = true
var arr = this.Visit
//数组去重
function distinct(arr) {
let newArr = []
for (let i = 0; i < arr.length; i++) {
if (newArr.indexOf(arr[i]) < 0) {
newArr.push(arr[i])
}
}
return newArr
}
this.Visit = distinct(arr)
console.log(this.Visit, "---最近访问")
uni.setStorage({
key: 'Visit_key',
data: this.Visit
});
this.$store.commit('location/setCityName',item.cityName)
this.$emit('back_city', item);
// this.$emit('updateData')
}
// else {
// this.$emit('back_city', 'no');
// }
},
getWarpweft() {
this.po_tips = '定位中'
this.$store.dispatch('location/getLocation').then(res => {
console.log(res,'locationinfo')
if(res != undefined){
this.$store.dispatch('location/getCityName2').then(res => {
this.po_tips = '重新定位';
// this.position = this['getCityName'];
})
}else{
this.po_tips = '定位失败'
}
})
return
var that = this
that.po_tips = '定位中...'
let qqmapsdk = new qqMap({
key: 'DABBZ-UVV33-TN63X-3YGRM-2L562-NHFGO' // 自己申请的key
})
this.$store.dispatch('location/getLocation').then(res => {
qqmapsdk.reverseGeocoder({
location: {
latitude: res.latitude,
longitude: res.longitude
},
success(res) {
console.log(res)
that.position = res.result.address_component.city
that.po_tips = '重新定位'
},
fail(err) {
console.log(err)
}
})
})
}
}
};
</script>
<style scoped>
.wrapper {
position: fixed;
z-index: 999999;
background: #F5F5F5;
height: 100%;
width: 100%;
top: 0px;
left: 0px;
}
.mask {
position: absolute;
bottom: 0upx;
top: 83upx;
left: 0upx;
right: 0upx;
width: 750upx;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0);
}
.mask-r {
height: 120upx;
width: 120upx;
border-radius: 60upx;
display: flex;
background: rgba(0, 0, 0, 0.5);
justify-content: center;
align-items: center;
font-size: 40upx;
color: #FFFFFF
}
.content {
height: 100%;
width: 100%;
background-color: #ffffff;
}
.header {
height: 85upx;
display: flex;
justify-content: flex-start;
align-items: center;
display: flex;
}
.back_div {
width: 35rpx;
height: 35rpx;
display: flex;
justify-content: center;
align-items: center;
position: absolute;
top: 30rpx;
left: 280rpx;
}
.back_img {
width: 35rpx;
height: 35rpx;
}
.input {
font-size: 24upx;
width: 720rpx;
height: 60rpx;
border-radius: 40upx;
background-color: #FFFFFF;
padding-left: 20upx;
padding-right: 20upx;
box-sizing: border-box;
border: 2rpx solid #DEDEDE;
text-align: center;
margin: 0 auto;
color: #999;
}
.inputActive {
text-align: left !important;
}
.title {
font-size: 30upx;
color: white;
}
.show {
left: 0;
width: 100%;
transition: left 0.3s ease;
}
.hide {
left: 100%;
width: 100%;
transition: left 0.3s ease;
}
.title {
font-size: 30upx;
color: white;
}
.calendar-list {
position: absolute;
top: 83upx;
bottom: 0upx;
width: 100%;
}
.letters {
position: absolute;
right: 30upx;
bottom: 0px;
width: 50upx;
top: 260upx;
color: #2f9bfe;
text-align: center;
font-size: 24upx;
}
.letters-item {
margin-bottom: 5upx;
color: #666666;
}
.letter-header {
height: 45upx;
font-size: 22upx;
color: #333333;
padding-left: 24upx;
box-sizing: border-box;
display: flex;
align-items: center;
/* background-color: #ebedef; */
}
.city-div {
width: 660upx;
height: 85upx;
margin-left: 24upx;
border-bottom-width: 0.5upx;
border-bottom-color: #ebedef;
border-bottom-style: solid;
display: flex;
align-items: center;
margin-right: 35upx;
}
.city {
padding-left: 30upx;
font-size: 24rpx;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
color: #333333;
line-height: 34rpx;
}
.dingwei {
width: 100%;
padding-top: 25upx;
box-sizing: border-box;
margin-bottom: 26upx;
}
.dingwei_Tips {
margin-left: 24upx;
margin-bottom: 24upx;
font-size: 24upx;
color: #A5A5A5;
}
.dingwei_refresh {
width: 44rpx;
height: 44rpx;
}
.dingwei_city {
width: 100%;
padding-left: 55upx;
padding-right: 70upx;
box-sizing: border-box;
display: flex;
}
.dingwei_city_one {
width: 218rpx;
height: 80rpx;
line-height: 80rpx;
font-size: 24rpx;
color: #333333;
display: flex;
justify-content: center;
align-items: center;
background: #DEDEDE;
border-radius: 44rpx;
margin-right: 6rpx;
}
.dingweis_div {
display: flex;
align-content: flex-end;
align-items: center;
font-size: 24upx;
color: #FD5745;
}
.dingweis {
width: 32upx;
height: 32upx;
}
.dingwei_city_zuijin {
display: flex;
justify-content: flex-start;
}
.toright {
margin-right: 25upx;
}
</style>