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