| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 | <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>
 |