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