mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-10-31 02:28:03 +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>
 | |
| 
 | 
