| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 | 
							- <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>
 
 
  |