301 lines
7.6 KiB
Vue
301 lines
7.6 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>
|