mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 18:28:43 +08:00 
			
		
		
		
	
		
			
	
	
		
			184 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
		
		
			
		
	
	
			184 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
|   | <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> | ||
|  | 
 |