<template> <view class=""> <u-popup :show="show" mode="bottom" @close="$emit('close')" :round="10" :closeable="true" > <view style=" height: 100rpx; line-height: 100rpx; text-align: center; font-size: 36rpx; color: #222; " > 选择省市区 </view> <view> <!-- <input type="text" class="inp" v-model="cityValue" /> --> <view class="title"> 热门城市 </view> <view class="city-list"> <view class="city" :class="{ 'select-city': hotCityName == item }" v-for="(item, index) in hotCityList" :key="index" @click="searchCity(item)" > {{ item }} </view> </view> <picker-view class="picker-view" :indicator-style="indicatorStyle" :value="value" @change="bindChange" :mask-top-style="maskTopStyle" :mask-bottom-style="maskBottomStyle" > <picker-view-column class="picker-view-column"> <view class="item" v-for="(item, index) in cityList" :key="index" ><text class="text">{{ item.name }}</text></view > </picker-view-column> <picker-view-column class="picker-view-column"> <view class="item" v-for="(item, index) in marketList" :key="index" ><text class="text">{{ item.name }}</text> </view> </picker-view-column> <picker-view-column class="picker-view-column"> <view class="item" v-for="(item, index) in distinguishList" :key="index" ><text class="text">{{ item.name }}</text> </view> </picker-view-column> </picker-view> <button @click="submit" class="confirm">确定</button> </view> </u-popup> </view> </template> <script> export default { props: { show: { typeof: Boolean, default: false, }, cityId: { typeof: Array, default: () => { return []; }, }, countryId: { typeof: String, default: "100000", }, }, watch: { cityId(newVal) { if (newVal.length == 3) { this.cityList.forEach((item, index) => { if (item.pid == newVal[0]) { this.value.push(index); item.children.forEach((items, indexs) => { if (items.pid == newVal[1]) { this.value.push(indexs); items.children.forEach((elem, i) => { if (elem.pid == newVal[2]) { this.value.push(i); } }); } }); } }); } else { this.value = [0, 0, 0]; } }, countryId(newVal) { if (newVal != "100000") { this.getCityList(); } }, }, data() { return { hotCityList: [ "北京", "上海", "深圳", "广州", "天津", "青岛", "长沙", "成都", ], cityList: [], title: "picker-view", marketList: [], distinguishList: [], value: [0, 0, 0], result: [], indicatorStyle: "height: 50px;", maskTopStyle: "", maskBottomStyle: "", economize: {}, market: {}, distinguish: {}, isValue: true, cityValue: "", hotCityName: "", }; }, mounted() { this.getCityList(); }, methods: { // open() { // this.getCityList(); // }, //当选中的城市发生变化时调用 bindChange(e) { this.isValue = false; const val = e.detail.value; this.value = val; this.marketList = this.cityList[val[0]].children; this.distinguishList = this.marketList[val[1] || 0].children; this.economize = this.cityList[val[0]]; this.market = this.marketList[val[1] || 0]; this.distinguish = this.distinguishList[val[2] || 0]; }, //选择热门城市 searchCity(value) { this.hotCityName = value; //确定选中的城市 this.cityList.map((cityItem, cityIndex) => { cityItem.children.map((marketItem, marketIndex) => { if (marketItem.name.includes(value)) { //赋值市级选择数组 this.marketList = this.cityList[cityIndex].children; const timer = setTimeout(() => { this.value = [cityIndex, marketIndex, 0]; //赋值区县级选择数组 this.distinguishList = this.marketList[marketIndex].children; clearTimeout(timer); }, 100); } }); }); }, //获取城市 getCityList() { uni.$u.http.get(`/api/area/tree?pid=${this.countryId}`).then((res) => { this.cityList = res; if (this.countryId == "100000") { this.marketList = res[this.value[1]].children; this.distinguishList = this.marketList[this.value[2]].children; } }); }, //提交选中的城市 submit() { if (this.isValue) { this.marketList = this.cityList[this.value[0]].children; this.distinguishList = this.marketList[this.value[1] || 0].children; this.economize = this.cityList[this.value[0]]; this.market = this.marketList[this.value[1] || 0]; this.distinguish = this.distinguishList[this.value[2] || 0]; } const obj = { ...this.economize, children: { ...this.market, children: this.distinguish, }, }; this.$emit("close", obj); }, }, }; </script> <style lang="scss" scoped> .title { margin: 32rpx 26rpx; } .inp { background-color: #f4f4f4; border-radius: 36rpx; height: 72rpx; width: 694rpx; margin: 30rpx auto 0; padding-left: 20rpx; } .city-list { display: flex; justify-content: space-around; flex-wrap: wrap; .city { width: 156rpx; height: 68rpx; text-align: center; line-height: 68rpx; background-color: #f4f4f4; border-radius: 36rpx; margin-bottom: 20rpx; color: #222; font-size: 28rpx; } .select-city { color: #f83224; border: 2rpx solid #f83224; } } .confirm { background-color: #f83224; border-radius: 40rpx; color: #fff; width: 702rpx; margin: 0 auto; } .picker-view { width: 100%; height: 180px; margin-top: 10px; } .item { height: 50px; } .text { line-height: 50px; text-align: center; } .picker-view-column { text-align: center; } </style>