mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-01 02:38:43 +08:00 
			
		
		
		
	
		
			
	
	
		
			275 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
		
		
			
		
	
	
			275 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
|   | <template> | ||
|  | 	<view class="w-picker-view"> | ||
|  | 		<picker-view class="d-picker-view" :indicator-style="itemHeight" :value="pickVal" @change="handlerChange"> | ||
|  | 			<picker-view-column v-for="(group,gIndex) in range" :key="gIndex"> | ||
|  | 				<view class="w-picker-item" v-for="(item,index) in group" :key="index">{{item[nodeKey]}}</view> | ||
|  | 			</picker-view-column> | ||
|  | 		</picker-view> | ||
|  | 	</view> | ||
|  | </template> | ||
|  | 
 | ||
|  | <script> | ||
|  | 	export default { | ||
|  | 		data() { | ||
|  | 			return { | ||
|  | 				pickVal:[], | ||
|  | 				range:[], | ||
|  | 				checkObj:{} | ||
|  | 			}; | ||
|  | 		}, | ||
|  | 		props:{ | ||
|  | 			itemHeight:{ | ||
|  | 				type:String, | ||
|  | 				default:"44px" | ||
|  | 			}, | ||
|  | 			value:{ | ||
|  | 				type:[Array,String], | ||
|  | 				default:"" | ||
|  | 			}, | ||
|  | 			defaultType:{ | ||
|  | 				type:String, | ||
|  | 				default:"label" | ||
|  | 			}, | ||
|  | 			options:{ | ||
|  | 				type:Array, | ||
|  | 				default(){ | ||
|  | 					return [] | ||
|  | 				} | ||
|  | 			}, | ||
|  | 			defaultProps:{ | ||
|  | 				type:Object, | ||
|  | 				default(){ | ||
|  | 					return{ | ||
|  | 						lable:"label", | ||
|  | 						value:"value", | ||
|  | 						children:"children" | ||
|  | 					} | ||
|  | 				} | ||
|  | 			}, | ||
|  | 			level:{ | ||
|  | 				//多级联动层级,表示几级联动
 | ||
|  | 				type:[Number,String], | ||
|  | 				default:2 | ||
|  | 			} | ||
|  | 		}, | ||
|  | 		computed:{ | ||
|  | 			nodeKey(){ | ||
|  | 				return this.defaultProps.label; | ||
|  | 			}, | ||
|  | 			nodeVal(){ | ||
|  | 				return this.defaultProps.value; | ||
|  | 			}, | ||
|  | 			nodeChild(){ | ||
|  | 				return this.defaultProps.children; | ||
|  | 			} | ||
|  | 		}, | ||
|  | 		watch:{ | ||
|  | 			value(val){ | ||
|  | 				if(this.options.length!=0){ | ||
|  | 					this.initData(); | ||
|  | 				} | ||
|  | 			}, | ||
|  | 			options(val){ | ||
|  | 				this.initData(); | ||
|  | 			} | ||
|  | 		}, | ||
|  | 		created() { | ||
|  | 			if(this.options.length!=0){ | ||
|  | 				this.initData(); | ||
|  | 			} | ||
|  | 		}, | ||
|  | 		methods:{ | ||
|  | 			getData(){ | ||
|  | 				//用来处理初始化数据
 | ||
|  | 				let options=this.options; | ||
|  | 				let col1={},col2={},col3={},col4={}; | ||
|  | 				let arr1=options,arr2=[],arr3=[],arr4=[]; | ||
|  | 				let col1Index=0,col2Index=0,col3Index=0,col4Index=0; | ||
|  | 				let a1="",a2="",a3="",a4=""; | ||
|  | 				let dVal=[],obj={}; | ||
|  | 				let value=this.value; | ||
|  | 				let data=[]; | ||
|  | 				a1=value[0]; | ||
|  | 				a2=value[1]; | ||
|  | 				if(this.level>2){ | ||
|  | 					a3=value[2]; | ||
|  | 				} | ||
|  | 				if(this.level>3){ | ||
|  | 					a4=value[3]; | ||
|  | 				}; | ||
|  | 				/*第1列*/ | ||
|  | 				col1Index=arr1.findIndex((v)=>{ | ||
|  | 					return v[this.defaultType]==a1 | ||
|  | 				}); | ||
|  | 				col1Index=value?(col1Index!=-1?col1Index:0):0; | ||
|  | 				col1=arr1[col1Index]; | ||
|  | 				 | ||
|  | 				/*第2列*/ | ||
|  | 				arr2=arr1[col1Index][this.nodeChild]; | ||
|  | 				col2Index=arr2.findIndex((v)=>{ | ||
|  | 					return v[this.defaultType]==a2 | ||
|  | 				}); | ||
|  | 				col2Index=value?(col2Index!=-1?col2Index:0):0; | ||
|  | 				col2=arr2[col2Index]; | ||
|  | 				 | ||
|  | 				/*第3列*/ | ||
|  | 				if(this.level>2){ | ||
|  | 					arr3=arr2[col2Index][this.nodeChild]; | ||
|  | 					col3Index=arr3.findIndex((v)=>{ | ||
|  | 						return v[this.defaultType]==a3; | ||
|  | 					}); | ||
|  | 					col3Index=value?(col3Index!=-1?col3Index:0):0; | ||
|  | 					col3=arr3[col3Index]; | ||
|  | 				}; | ||
|  | 				 | ||
|  | 				 | ||
|  | 				/*第4列*/ | ||
|  | 				if(this.level>3){ | ||
|  | 					arr4=arr3[col4Index][this.nodeChild]; | ||
|  | 					col4Index=arr4.findIndex((v)=>{ | ||
|  | 						return v[this.defaultType]==a4; | ||
|  | 					}); | ||
|  | 					col4Index=value?(col4Index!=-1?col4Index:0):0; | ||
|  | 					col4=arr4[col4Index]; | ||
|  | 				}; | ||
|  | 				switch(this.level*1){ | ||
|  | 					case 2: | ||
|  | 						dVal=[col1Index,col2Index]; | ||
|  | 						obj={ | ||
|  | 							col1, | ||
|  | 							col2 | ||
|  | 						} | ||
|  | 						data=[arr1,arr2]; | ||
|  | 						break; | ||
|  | 					case 3: | ||
|  | 						dVal=[col1Index,col2Index,col3Index]; | ||
|  | 						obj={ | ||
|  | 							col1, | ||
|  | 							col2, | ||
|  | 							col3 | ||
|  | 						} | ||
|  | 						data=[arr1,arr2,arr3]; | ||
|  | 						break; | ||
|  | 					case 4: | ||
|  | 						dVal=[col1Index,col2Index,col3Index,col4Index]; | ||
|  | 						obj={ | ||
|  | 							col1, | ||
|  | 							col2, | ||
|  | 							col3, | ||
|  | 							col4 | ||
|  | 						} | ||
|  | 						data=[arr1,arr2,arr3,arr4]; | ||
|  | 						break | ||
|  | 				} | ||
|  | 				return { | ||
|  | 					data, | ||
|  | 					dVal, | ||
|  | 					obj | ||
|  | 				} | ||
|  | 			}, | ||
|  | 			initData(){ | ||
|  | 				let dataData=this.getData(); | ||
|  | 				let data=dataData.data; | ||
|  | 				let arr1=data[0]; | ||
|  | 				let arr2=data[1]; | ||
|  | 				let arr3=data[2]||[]; | ||
|  | 				let arr4=data[3]||[]; | ||
|  | 				let obj=dataData.obj; | ||
|  | 				let col1=obj.col1,col2=obj.col2,col3=obj.col3||{},col4=obj.col4||{}; | ||
|  | 				let result="",value=[]; | ||
|  | 				let range=[]; | ||
|  | 				switch(this.level){ | ||
|  | 					case 2: | ||
|  | 						value=[col1[this.nodeVal],col2[this.nodeVal]]; | ||
|  | 						result=`${col1[this.nodeKey]+col2[this.nodeKey]}`; | ||
|  | 						range=[arr1,arr2]; | ||
|  | 						break; | ||
|  | 					case 3: | ||
|  | 						value=[col1[this.nodeVal],col2[this.nodeVal],col3[this.nodeVal]]; | ||
|  | 						result=`${col1[this.nodeKey]+col2[this.nodeKey]+col3[this.nodeKey]}`; | ||
|  | 						range=[arr1,arr2,arr3]; | ||
|  | 						break; | ||
|  | 					case 4: | ||
|  | 						value=[col1[this.nodeVal],col2[this.nodeVal],col3[this.nodeVal],col4[this.nodeVal]]; | ||
|  | 						result=`${col1[this.nodeKey]+col2[this.nodeKey]+col3[this.nodeKey]+col4[this.nodeKey]}`; | ||
|  | 						range=[arr1,arr2,arr3,arr4]; | ||
|  | 						break; | ||
|  | 				} | ||
|  | 				this.range=range; | ||
|  | 				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 col1Index=arr[0],col2Index=arr[1],col3Index=arr[2]||0,col4Index=arr[3]||0; | ||
|  | 				let arr1=[],arr2=[],arr3=[],arr4=[]; | ||
|  | 				let col1,col2,col3,col4,obj={}; | ||
|  | 				let result="",value=[]; | ||
|  | 				arr1=this.options; | ||
|  | 				arr2=(arr1[col1Index]&&arr1[col1Index][this.nodeChild])||arr1[arr1.length-1][this.nodeChild]||[]; | ||
|  | 				col1=arr1[col1Index]||arr1[arr1.length-1]||{}; | ||
|  | 				col2=arr2[col2Index]||arr2[arr2.length-1]||{}; | ||
|  | 				if(this.level>2){ | ||
|  | 					arr3=(arr2[col2Index]&&arr2[col2Index][this.nodeChild])||arr2[arr2.length-1][this.nodeChild]; | ||
|  | 					col3=arr3[col3Index]||arr3[arr3.length-1]||{}; | ||
|  | 				} | ||
|  | 				if(this.level>3){ | ||
|  | 					arr4=(arr3[col3Index]&&arr3[col3Index][this.nodeChild])||arr3[arr3.length-1][this.nodeChild]||[]; | ||
|  | 					col4=arr4[col4Index]||arr4[arr4.length-1]||{}; | ||
|  | 				} | ||
|  | 				switch(this.level){ | ||
|  | 					case 2: | ||
|  | 						obj={ | ||
|  | 							col1, | ||
|  | 							col2 | ||
|  | 						} | ||
|  | 						this.range=[arr1,arr2]; | ||
|  | 						result=`${(col1[this.nodeKey]||'')+(col2[this.nodeKey]||'')}`; | ||
|  | 						value=[col1[this.nodeVal]||'',col2[this.nodeVal]||'']; | ||
|  | 						break; | ||
|  | 					case 3: | ||
|  | 						obj={ | ||
|  | 							col1, | ||
|  | 							col2, | ||
|  | 							col3 | ||
|  | 						} | ||
|  | 						this.range=[arr1,arr2,arr3]; | ||
|  | 						result=`${(col1[this.nodeKey]||'')+(col2[this.nodeKey]||'')+(col3[this.nodeKey]||'')}`; | ||
|  | 						value=[col1[this.nodeVal]||'',col2[this.nodeVal]||'',col3[this.nodeVal]||'']; | ||
|  | 						break; | ||
|  | 					case 4: | ||
|  | 						obj={ | ||
|  | 							col1, | ||
|  | 							col2, | ||
|  | 							col3, | ||
|  | 							col4 | ||
|  | 						} | ||
|  | 						this.range=[arr1,arr2,arr3,arr4]; | ||
|  | 						result=`${(col1[this.nodeKey]||'')+(col2[this.nodeKey]||'')+(col3[this.nodeKey]||'')+(col4[this.nodeKey]||'')}`; | ||
|  | 						value=[col1[this.nodeVal]||'',col2[this.nodeVal]||'',col3[this.nodeVal]||'',col4[this.nodeVal]||'']; | ||
|  | 						break; | ||
|  | 				} | ||
|  | 				this.checkObj=obj; | ||
|  | 				this.pickVal=arr; | ||
|  | 				this.$emit("change",{ | ||
|  | 					result:result, | ||
|  | 					value:value, | ||
|  | 					obj:obj | ||
|  | 				}) | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | </script> | ||
|  | 
 | ||
|  | <style lang="scss"> | ||
|  | 	@import "./w-picker.css";	 | ||
|  | </style> | ||
|  | 
 |