mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-01 02:38:43 +08:00 
			
		
		
		
	
		
			
	
	
		
			130 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
		
		
			
		
	
	
			130 lines
		
	
	
		
			2.5 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" :key="index">{{item[nodeKey]}}</view> | ||
|  | 			</picker-view-column> | ||
|  | 		</picker-view> | ||
|  | 	</view> | ||
|  | </template> | ||
|  | 
 | ||
|  | <script> | ||
|  | 	export default { | ||
|  | 		props:{ | ||
|  | 			itemHeight:{ | ||
|  | 				type:String, | ||
|  | 				default:"44px" | ||
|  | 			}, | ||
|  | 			options:{ | ||
|  | 				type:[Array,Object], | ||
|  | 				default(){ | ||
|  | 					return [] | ||
|  | 				} | ||
|  | 			}, | ||
|  | 			value:{ | ||
|  | 				type:String, | ||
|  | 				default:"" | ||
|  | 			}, | ||
|  | 			defaultType:{ | ||
|  | 				type:String, | ||
|  | 				default:"label" | ||
|  | 			}, | ||
|  | 			defaultProps:{ | ||
|  | 				type:Object, | ||
|  | 				default(){ | ||
|  | 					return{ | ||
|  | 						label:"label", | ||
|  | 						value:"value" | ||
|  | 					} | ||
|  | 				} | ||
|  | 			} | ||
|  | 		}, | ||
|  | 		data() { | ||
|  | 			return { | ||
|  | 				pickVal:[] | ||
|  | 			}; | ||
|  | 		}, | ||
|  | 		computed:{ | ||
|  | 			nodeKey(){ | ||
|  | 				return this.defaultProps.label; | ||
|  | 			}, | ||
|  | 			nodeValue(){ | ||
|  | 				return this.defaultProps.value; | ||
|  | 			}, | ||
|  | 			range(){ | ||
|  | 				return this.options | ||
|  | 			} | ||
|  | 		}, | ||
|  | 		watch:{ | ||
|  | 			value(val){ | ||
|  | 				if(this.options.length!=0){ | ||
|  | 					this.initData(); | ||
|  | 				} | ||
|  | 			}, | ||
|  | 			options(val){ | ||
|  | 				this.initData(); | ||
|  | 			} | ||
|  | 		}, | ||
|  | 		created() { | ||
|  | 			if(this.options.length!=0){ | ||
|  | 				this.initData(); | ||
|  | 			} | ||
|  | 		}, | ||
|  | 		methods:{ | ||
|  | 			initData(){ | ||
|  | 				let dVal=this.value||""; | ||
|  | 				let data=this.range; | ||
|  | 				let pickVal=[0]; | ||
|  | 				let cur=null; | ||
|  | 				let label=""; | ||
|  | 				let value,idx; | ||
|  | 				if(this.defaultType==this.nodeValue){ | ||
|  | 					value=data.find((v)=>v[this.nodeValue]==dVal); | ||
|  | 					idx=data.findIndex((v)=>v[this.nodeValue]==dVal); | ||
|  | 				}else{ | ||
|  | 					value=data.find((v)=>v[this.nodeKey]==dVal); | ||
|  | 					idx=data.findIndex((v)=>v[this.nodeKey]==dVal); | ||
|  | 				} | ||
|  | 				pickVal=[idx!=-1?idx:0]; | ||
|  | 				this.$nextTick(()=>{ | ||
|  | 					this.pickVal=pickVal; | ||
|  | 				}); | ||
|  | 				if(this.defaultType==this.nodeValue){ | ||
|  | 					this.$emit("change",{ | ||
|  | 						result:value?value[this.nodeKey]:data[0][this.nodeKey], | ||
|  | 						value:dVal||data[0][this.nodeKey], | ||
|  | 						obj:value?value:data[0] | ||
|  | 					}) | ||
|  | 				}else{ | ||
|  | 					this.$emit("change",{ | ||
|  | 						result:dVal||data[0][this.nodeKey], | ||
|  | 						value:value?value[this.nodeValue]:data[0][this.nodeValue], | ||
|  | 						obj:value?value:data[0] | ||
|  | 					}) | ||
|  | 				} | ||
|  | 				 | ||
|  | 			}, | ||
|  | 			handlerChange(e){ | ||
|  | 				let arr=[...e.detail.value]; | ||
|  | 				let pickVal=[arr[0]||0]; | ||
|  | 				let data=this.range; | ||
|  | 				let cur=data[arr[0]]; | ||
|  | 				let label=""; | ||
|  | 				let value=""; | ||
|  | 				this.$nextTick(()=>{ | ||
|  | 					this.pickVal=pickVal; | ||
|  | 				}); | ||
|  | 				this.$emit("change",{ | ||
|  | 					result:cur[this.nodeKey], | ||
|  | 					value:cur[this.nodeValue], | ||
|  | 					obj:cur | ||
|  | 				}) | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | </script> | ||
|  | 
 | ||
|  | <style lang="scss"> | ||
|  | 	@import "./w-picker.css"; | ||
|  | </style> |