Houjie
2025-04-11 1bf977929dd324f3ac64b70debd8a79443c54392
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
<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>