141 lines
4.4 KiB
Vue
141 lines
4.4 KiB
Vue
|
|
<template>
|
|||
|
|
<view style="width: 100%">
|
|||
|
|
<u--input :value="formatValue(value)" disabledColor="#ffffff" :placeholder="placeholder"
|
|||
|
|
border="border"></u--input>
|
|||
|
|
<u-picker ref="uPicker" :show="visibel" :keyName="labelName" :columns="VarColumns" @confirm="skillConfirm"
|
|||
|
|
@cancel="skillClose" @close="skillClose" @change="changeHandler"></u-picker>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
import {
|
|||
|
|
isArray
|
|||
|
|
} from 'lodash'
|
|||
|
|
export default {
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
valued: '',
|
|||
|
|
VarColumnsIndex: [],
|
|||
|
|
VarColumns: [],
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
props: {
|
|||
|
|
border: {
|
|||
|
|
type: String,
|
|||
|
|
default: 'none'
|
|||
|
|
},
|
|||
|
|
valueName: {
|
|||
|
|
type: String,
|
|||
|
|
default: 'value'
|
|||
|
|
},
|
|||
|
|
labelName: {
|
|||
|
|
type: String,
|
|||
|
|
default: 'label'
|
|||
|
|
},
|
|||
|
|
placeholder: {
|
|||
|
|
type: String,
|
|||
|
|
default: '请选择'
|
|||
|
|
},
|
|||
|
|
visibel: {
|
|||
|
|
type: Boolean,
|
|||
|
|
default: false,
|
|||
|
|
},
|
|||
|
|
tree: {
|
|||
|
|
type: Array,
|
|||
|
|
require: true
|
|||
|
|
},
|
|||
|
|
deep: {
|
|||
|
|
type: Number,
|
|||
|
|
require: 1
|
|||
|
|
},
|
|||
|
|
value: {
|
|||
|
|
type: String,
|
|||
|
|
require: ''
|
|||
|
|
},
|
|||
|
|
cancel: {
|
|||
|
|
type: Function
|
|||
|
|
},
|
|||
|
|
returnValue: {
|
|||
|
|
type: String,
|
|||
|
|
default: 'value',
|
|||
|
|
},
|
|||
|
|
joinSymbel: {
|
|||
|
|
type: String,
|
|||
|
|
default: '-',
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
created() {
|
|||
|
|
this.VarColumnsIndex = new Array(3).fill(this.deep)
|
|||
|
|
const arr = []
|
|||
|
|
this.changeHandler({
|
|||
|
|
columnIndex: 0,
|
|||
|
|
index: 0
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
skillClose() {
|
|||
|
|
this.$emit("cancel");
|
|||
|
|
},
|
|||
|
|
skillConfirm({
|
|||
|
|
index,
|
|||
|
|
value,
|
|||
|
|
values
|
|||
|
|
}) {
|
|||
|
|
if (this.returnValue === 'label') {
|
|||
|
|
this.$emit("input", value.map(item => item[this.labelName]).join(this.joinSymbel));
|
|||
|
|
} else {
|
|||
|
|
this.$emit("input", value);
|
|||
|
|
}
|
|||
|
|
this.$emit("cancel");
|
|||
|
|
},
|
|||
|
|
changeHandler(e) {
|
|||
|
|
const {
|
|||
|
|
columnIndex,
|
|||
|
|
value,
|
|||
|
|
values, // values为当前变化列的数组内容
|
|||
|
|
index,
|
|||
|
|
} = e
|
|||
|
|
// 微信小程序无法将picker实例传出来,只能通过ref操作
|
|||
|
|
const picker = this.$refs.uPicker
|
|||
|
|
const columnlist = []
|
|||
|
|
const arr = JSON.parse(JSON.stringify(this.VarColumnsIndex)).map((vItem, vIndex) => {
|
|||
|
|
switch (true) {
|
|||
|
|
case vIndex < columnIndex:
|
|||
|
|
return vItem
|
|||
|
|
case vIndex === columnIndex:
|
|||
|
|
return index
|
|||
|
|
default:
|
|||
|
|
return 0
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
for (let i = 0; i <= arr.length - 1; i++) {
|
|||
|
|
if (i) {
|
|||
|
|
if (picker) {
|
|||
|
|
picker.setColumnValues(i, columnlist[columnlist.length - 1][arr[i - 1]].children)
|
|||
|
|
}
|
|||
|
|
columnlist.push(columnlist[columnlist.length - 1][arr[i - 1]].children)
|
|||
|
|
} else {
|
|||
|
|
columnlist.push(this.tree)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
this.VarColumnsIndex = arr
|
|||
|
|
this.VarColumns = columnlist
|
|||
|
|
},
|
|||
|
|
formatValue(val) {
|
|||
|
|
if (Array.isArray(val)) {
|
|||
|
|
if (typeof val[0] === 'object') {
|
|||
|
|
return val.map(item => item[this.labelName]).join(this.joinSymbel)
|
|||
|
|
} else {
|
|||
|
|
return val.join(this.joinSymbel)
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
return val
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style>
|
|||
|
|
</style>
|