339 lines
10 KiB
Vue
339 lines
10 KiB
Vue
|
<template>
|
|||
|
<view>
|
|||
|
<!--自定义地址选择器-->
|
|||
|
<view class="cc_area_mask" v-show="show == true"></view>
|
|||
|
<view :class="'cc_area_view ' + (show ? 'show' : 'hide')">
|
|||
|
<view class="cc_area_view_btns">
|
|||
|
<text class="cc_area_view_btn_cancle" @click="handleNYZAreaCancle">取消</text>
|
|||
|
<text class="cc_area_view_btn_sure" @click="handleNYZAreaSelect" :data-province="province"
|
|||
|
:data-city="city" :data-area="area">确定</text>
|
|||
|
</view>
|
|||
|
<picker-view class="cc_area_pick_view" indicator-style="height: 35px;" @change="handleNYZAreaChange"
|
|||
|
:value="value">
|
|||
|
<picker-view-column>
|
|||
|
<view v-for="(item, index) in provinces" :key="index" class="cc_area_colum_view">{{ item }}</view>
|
|||
|
</picker-view-column>
|
|||
|
<picker-view-column>
|
|||
|
<view v-for="(item, index) in citys" :key="index" class="cc_area_colum_view">{{ item }}</view>
|
|||
|
</picker-view-column>
|
|||
|
<picker-view-column>
|
|||
|
<view v-for="(item, index) in areas" :key="index" class="cc_area_colum_view">{{ item }}</view>
|
|||
|
</picker-view-column>
|
|||
|
</picker-view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
import { getProvinces, getMyCity, getAreas, getAreasCode } from "./area.js"
|
|||
|
|
|||
|
let index = [0, 0, 0];
|
|||
|
let provinces = getProvinces();
|
|||
|
let citys = getMyCity(index[0]);
|
|||
|
let areas = getMyCity(index[0], index[1]);
|
|||
|
|
|||
|
export default {
|
|||
|
mixins: [{
|
|||
|
methods: {
|
|||
|
setData: function (obj, callback) {
|
|||
|
let that = this;
|
|||
|
const handleData = (tepData, tepKey, afterKey) => {
|
|||
|
tepKey = tepKey.split('.');
|
|||
|
tepKey.forEach(item => {
|
|||
|
if (tepData[item] === null || tepData[item] === undefined) {
|
|||
|
let reg = /^[0-9]+$/;
|
|||
|
tepData[item] = reg.test(afterKey) ? [] : {};
|
|||
|
tepData = tepData[item];
|
|||
|
} else {
|
|||
|
tepData = tepData[item];
|
|||
|
}
|
|||
|
});
|
|||
|
return tepData;
|
|||
|
};
|
|||
|
const isFn = function (value) {
|
|||
|
return typeof value == 'function' || false;
|
|||
|
};
|
|||
|
Object.keys(obj).forEach(function (key) {
|
|||
|
let val = obj[key];
|
|||
|
key = key.replace(/\]/g, '').replace(/\[/g, '.');
|
|||
|
let front, after;
|
|||
|
let index_after = key.lastIndexOf('.');
|
|||
|
if (index_after != -1) {
|
|||
|
after = key.slice(index_after + 1);
|
|||
|
front = handleData(that, key.slice(0, index_after), after);
|
|||
|
} else {
|
|||
|
after = key;
|
|||
|
front = that;
|
|||
|
}
|
|||
|
if (front.$data && front.$data[after] === undefined) {
|
|||
|
Object.defineProperty(front, after, {
|
|||
|
get() {
|
|||
|
return front.$data[after];
|
|||
|
},
|
|||
|
set(newValue) {
|
|||
|
front.$data[after] = newValue;
|
|||
|
that.$forceUpdate();
|
|||
|
},
|
|||
|
enumerable: true,
|
|||
|
configurable: true
|
|||
|
});
|
|||
|
|
|||
|
// #ifndef VUE3
|
|||
|
that.$set(front, after, val);
|
|||
|
// #endif
|
|||
|
|
|||
|
// #ifdef VUE3
|
|||
|
Reflect.set(front, after, val);
|
|||
|
// #endif
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
// #ifndef VUE3
|
|||
|
that.$set(front, after, val);
|
|||
|
// #endif
|
|||
|
|
|||
|
// #ifdef VUE3
|
|||
|
Reflect.set(front, after, val);
|
|||
|
// #endif
|
|||
|
}
|
|||
|
});
|
|||
|
isFn(callback) && this.$nextTick(callback);
|
|||
|
}
|
|||
|
}
|
|||
|
}],
|
|||
|
data() {
|
|||
|
return {
|
|||
|
provinces: getProvinces(),
|
|||
|
citys: getMyCity(index[0]),
|
|||
|
areas: getAreas(index[0], index[1]),
|
|||
|
value: [0, 0, 0]
|
|||
|
};
|
|||
|
},
|
|||
|
|
|||
|
components: {},
|
|||
|
props: {
|
|||
|
// 省
|
|||
|
province: {
|
|||
|
//控制area_select显示隐藏
|
|||
|
type: String,
|
|||
|
default: ''
|
|||
|
},
|
|||
|
// 市
|
|||
|
city: {
|
|||
|
//控制area_select显示隐藏
|
|||
|
type: String,
|
|||
|
default: ''
|
|||
|
},
|
|||
|
// 区
|
|||
|
area: {
|
|||
|
//控制area_select显示隐藏
|
|||
|
type: String,
|
|||
|
default: ''
|
|||
|
},
|
|||
|
|
|||
|
show: {
|
|||
|
//控制area_select显示隐藏
|
|||
|
type: Boolean,
|
|||
|
default: false
|
|||
|
},
|
|||
|
maskShow: {
|
|||
|
//是否显示蒙层
|
|||
|
type: Boolean,
|
|||
|
default: true
|
|||
|
}
|
|||
|
},
|
|||
|
watch: {
|
|||
|
province() {
|
|||
|
this.init();
|
|||
|
},
|
|||
|
city() {
|
|||
|
this.init();
|
|||
|
},
|
|||
|
area() {
|
|||
|
this.init();
|
|||
|
}
|
|||
|
},
|
|||
|
mounted() {
|
|||
|
// let provinceIndex = this.provinces.indexOf(this.province);
|
|||
|
// this.citys = getMyCity(provinceIndex);
|
|||
|
// let cityIndex = this.citys.indexOf(this.city);
|
|||
|
// this.areas = getAreas(provinceIndex, cityIndex);
|
|||
|
// let areaIndex = this.areas.indexOf(this.area);
|
|||
|
|
|||
|
// // 设置选择序列
|
|||
|
// this.value = [provinceIndex, cityIndex, areaIndex];
|
|||
|
// let areaCode = getAreasCode(provinceIndex, cityIndex, areaIndex);
|
|||
|
|
|||
|
this.init();
|
|||
|
|
|||
|
//console.log(areaCode)
|
|||
|
//console.log("this.value = " + JSON.stringify(this.value));
|
|||
|
},
|
|||
|
methods: {
|
|||
|
init() {
|
|||
|
//console.log(this.area)
|
|||
|
let provinceIndex = this.provinces.indexOf(this.province);
|
|||
|
this.citys = getMyCity(provinceIndex);
|
|||
|
let cityIndex = this.citys.indexOf(this.city);
|
|||
|
this.areas = getAreas(provinceIndex, cityIndex);
|
|||
|
let areaIndex = this.areas.indexOf(this.area);
|
|||
|
|
|||
|
// 设置选择序列
|
|||
|
this.value = [provinceIndex, cityIndex, areaIndex];
|
|||
|
let areaCode = getAreasCode(provinceIndex, cityIndex, areaIndex);
|
|||
|
},
|
|||
|
handleNYZAreaChange: function (e) {
|
|||
|
var that = this;
|
|||
|
//console.log("e:" + JSON.stringify(e));
|
|||
|
var value = e.detail.value;
|
|||
|
/**
|
|||
|
* 滚动的是省
|
|||
|
* 省改变 市、区都不变
|
|||
|
*/
|
|||
|
|
|||
|
if (index[0] != value[0]) {
|
|||
|
index = [value[0], 0, 0];
|
|||
|
let selectCitys = getMyCity(index[0]);
|
|||
|
let selectAreas = getAreas(index[0], 0);
|
|||
|
that.setData({
|
|||
|
citys: selectCitys,
|
|||
|
areas: selectAreas,
|
|||
|
value: [index[0], 0, 0],
|
|||
|
|
|||
|
});
|
|||
|
|
|||
|
let areaCode = getAreasCode(index[0], index[1], index[2]);
|
|||
|
that.$emit("changeClick", provinces[index[0]], selectCitys[index[1]], selectAreas[index[2]], areaCode);
|
|||
|
|
|||
|
} else if (index[1] != value[1]) {
|
|||
|
/**
|
|||
|
* 市改变了 省不变 区变
|
|||
|
*/
|
|||
|
index = [value[0], value[1], 0];
|
|||
|
let selectCitys = getMyCity(index[0]);
|
|||
|
let selectAreas = getAreas(index[0], value[1]);
|
|||
|
that.setData({
|
|||
|
citys: selectCitys,
|
|||
|
areas: selectAreas,
|
|||
|
value: [index[0], index[1], 0],
|
|||
|
|
|||
|
});
|
|||
|
|
|||
|
let areaCode = getAreasCode(index[0], index[1], index[2]);
|
|||
|
that.$emit("changeClick", provinces[index[0]], selectCitys[index[1]], selectAreas[index[2]], areaCode);
|
|||
|
|
|||
|
} else if (index[2] != value[2]) {
|
|||
|
/**
|
|||
|
* 区改变了
|
|||
|
*/
|
|||
|
index = [value[0], value[1], value[2]];
|
|||
|
let selectCitys = getMyCity(index[0]);
|
|||
|
let selectAreas = getAreas(index[0], value[1]);
|
|||
|
that.setData({
|
|||
|
citys: selectCitys,
|
|||
|
areas: selectAreas,
|
|||
|
value: [index[0], index[1], index[2]],
|
|||
|
|
|||
|
});
|
|||
|
|
|||
|
let areaCode = getAreasCode(index[0], index[1], index[2]);
|
|||
|
that.$emit("changeClick", provinces[index[0]], selectCitys[index[1]], selectAreas[index[2]], areaCode);
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 确定按钮的点击事件
|
|||
|
*/
|
|||
|
handleNYZAreaSelect: function (e) {
|
|||
|
var myEventDetail = e; // detail对象,提供给事件监听函数
|
|||
|
var myEventOption = {}; // 触发事件的选项
|
|||
|
this.$emit('sureSelectArea', {
|
|||
|
detail: myEventDetail
|
|||
|
}, myEventOption);
|
|||
|
|
|||
|
index = [0, 0, 0];
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* 取消按钮的点击事件
|
|||
|
*/
|
|||
|
handleNYZAreaCancle: function (e) {
|
|||
|
var that = this;
|
|||
|
//console.log("e:" + JSON.stringify(e));
|
|||
|
this.$emit('hideShow', {
|
|||
|
detail: false
|
|||
|
});
|
|||
|
// 复原初始状态
|
|||
|
index = [0, 0, 0];
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
</script>
|
|||
|
<style scoped lang="scss">
|
|||
|
.cc_area_view {
|
|||
|
width: 100%;
|
|||
|
position: fixed;
|
|||
|
bottom: -1000px;
|
|||
|
left: 0px;
|
|||
|
background-color: #fff;
|
|||
|
z-index: 21;
|
|||
|
transition: all 0.3s;
|
|||
|
}
|
|||
|
|
|||
|
.cc_area_pick_view {
|
|||
|
height: 400px;
|
|||
|
width: 100%;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
.cc_area_colum_view {
|
|||
|
line-height: 35px;
|
|||
|
text-align: center;
|
|||
|
font-size: 28upx;
|
|||
|
}
|
|||
|
|
|||
|
.hide {
|
|||
|
bottom: -1000upx;
|
|||
|
transition: all 0.3s;
|
|||
|
}
|
|||
|
|
|||
|
.show {
|
|||
|
bottom: 0upx;
|
|||
|
transition: all 0.3s;
|
|||
|
}
|
|||
|
|
|||
|
.cc_area_view_btns {
|
|||
|
background-color: #fff;
|
|||
|
border-bottom: 1px solid #eeeeee;
|
|||
|
font-size: 30upx;
|
|||
|
padding: 18upx 0upx;
|
|||
|
}
|
|||
|
|
|||
|
.cc_area_view_btns>text {
|
|||
|
display: inline-block;
|
|||
|
word-spacing: 4upx;
|
|||
|
letter-spacing: 4upx;
|
|||
|
}
|
|||
|
|
|||
|
.cc_area_view_btn_cancle {
|
|||
|
color: #939393;
|
|||
|
padding-right: 20upx;
|
|||
|
padding-left: 25upx;
|
|||
|
}
|
|||
|
|
|||
|
.cc_area_view_btn_sure {
|
|||
|
float: right;
|
|||
|
padding-left: 20upx;
|
|||
|
padding-right: 25upx;
|
|||
|
}
|
|||
|
|
|||
|
.cc_area_mask {
|
|||
|
width: 100%;
|
|||
|
height: 100vh;
|
|||
|
background-color: rgba(28, 28, 28, 0.6);
|
|||
|
position: absolute;
|
|||
|
top: 0upx;
|
|||
|
left: 0upx;
|
|||
|
z-index: 20;
|
|||
|
}
|
|||
|
</style>
|