<template> <view class="w-picker-view"> <picker-view class="d-picker-view" :indicator-style="itemHeight" :value="pickVal" @change="handlerChange"> <picker-view-column> <view class="w-picker-item" v-for="(item,index) in range.provinces" :key="index">{{item.label}}</view> </picker-view-column> <picker-view-column> <view class="w-picker-item" v-for="(item,index) in range.citys" :key="index">{{item.label}}</view> </picker-view-column> <picker-view-column v-if="!hideArea"> <view class="w-picker-item" v-for="(item,index) in range.areas" :key="index">{{item.label}}</view> </picker-view-column> </picker-view> </view> </template> <script> import areaData from "./areadata/areadata.js" export default { data() { return { pickVal:[], range:{ provinces:[], citys:[], areas:[] }, checkObj:{} }; }, props:{ itemHeight:{ type:String, default:"44px" }, value:{ type:[Array,String], default:"" }, defaultType:{ type:String, default:"label" }, hideArea:{ type:Boolean, default:false } }, watch:{ value(val){ this.initData(); } }, created() { this.initData(); }, methods:{ getData(){ //用来处理初始化数据 let provinces=areaData; let dVal=[]; let value=this.value; let a1=value[0];//默认值省 let a2=value[1];//默认值市 let a3=value[2];//默认值区、县 let province,city,area; let provinceIndex=provinces.findIndex((v)=>{ return v[this.defaultType]==a1 }); provinceIndex=value?(provinceIndex!=-1?provinceIndex:0):0; let citys=provinces[provinceIndex].children; let cityIndex=citys.findIndex((v)=>{ return v[this.defaultType]==a2 }); cityIndex=value?(cityIndex!=-1?cityIndex:0):0; let areas=citys[cityIndex].children; let areaIndex=areas.findIndex((v)=>{ return v[this.defaultType]==a3; }); areaIndex=value?(areaIndex!=-1?areaIndex:0):0; dVal=this.hideArea?[provinceIndex,cityIndex]:[provinceIndex,cityIndex,areaIndex]; province=provinces[provinceIndex]; city=citys[cityIndex]; area=areas[areaIndex]; let obj=this.hideArea?{ province, city }:{ province, city, area } return this.hideArea?{ provinces, citys, dVal, obj }:{ provinces, citys, areas, dVal, obj } }, initData(){ let dataData=this.getData(); let provinces=dataData.provinces; let citys=dataData.citys; let areas=this.hideArea?[]:dataData.areas; let obj=dataData.obj; let province=obj.province,city=obj.city,area=this.hideArea?{}:obj.area; let value=this.hideArea?[province.value,city.value]:[province.value,city.value,area.value]; let result=this.hideArea?`${province.label+city.label}`:`${province.label+city.label+area.label}`; this.range=this.hideArea?{ provinces, citys, }:{ provinces, citys, areas }; this.checkObj=obj; this.$nextTick(()=>{ this.pickVal=dataData.dVal; }); this.$emit("change",{ result:result, value:value, obj:obj }) }, handlerChange(e){ let arr=[...e.detail.value]; let provinceIndex=arr[0],cityIndex=arr[1],areaIndex=this.hideArea?0:arr[2]; let provinces=areaData; let citys=(provinces[provinceIndex]&&provinces[provinceIndex].children)||provinces[provinces.length-1].children||[]; let areas=this.hideArea?[]:((citys[cityIndex]&&citys[cityIndex].children)||citys[citys.length-1].children||[]); let province=provinces[provinceIndex]||provinces[provinces.length-1], city=citys[cityIndex]||[citys.length-1], area=this.hideArea?{}:(areas[areaIndex]||[areas.length-1]); let obj=this.hideArea?{ province, city }:{ province, city, area } if(this.checkObj.province.label!=province.label){ //当省更新的时候需要刷新市、区县的数据; this.range.citys=citys; if(!this.hideArea){ this.range.areas=areas; } } if(this.checkObj.city.label!=city.label){ //当市更新的时候需要刷新区县的数据; if(!this.hideArea){ this.range.areas=areas; } } this.checkObj=obj; this.$nextTick(()=>{ this.pickVal=arr; }) let result=this.hideArea?`${province.label+city.label}`:`${province.label+city.label+area.label}`; let value=this.hideArea?[province.value,city.value]:[province.value,city.value,area.value]; this.$emit("change",{ result:result, value:value, obj:obj }) } } } </script> <style lang="scss"> @import "./w-picker.css"; </style>