You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
6.5 KiB
170 lines
6.5 KiB
<!-- 多列选择器 --> |
|
<template> |
|
<picker mode="multiSelector" @columnchange="handleColumnChange" @change="pickerChange" :value="multiIndex" :range="multiArray" :range-key="rangekey"> |
|
<view class="uni-input space-between" hover-class="hover-color"> |
|
<slot name="before"></slot> |
|
<text class="input-content ellipsis" :class="name?'':'color-placeholder'">{{name?name:placeholder}}</text> |
|
<slot name="after"></slot> |
|
</view> |
|
</picker> |
|
</template> |
|
<script> |
|
export default { |
|
props: { |
|
value: { default: ''}, // 必须要使用value |
|
list: {type: Array, default: [] }, |
|
rangekey: { default: 'name' }, // 对应name取值 |
|
childkey: { default: 'children' }, // 子集 |
|
code: { default: 'code' }, // 对应value取值 |
|
pidkey: { default: 'pid' }, // 对应父id取值 |
|
placeholder: { default: '请选择' }, |
|
emitPath: { default: false, type: Boolean }, // 是否子父级关联 ,是的时候返回的是逗号分隔的父子code |
|
level: { default: 2, type: Number } // 列数 2或者3 |
|
}, |
|
data() { |
|
return { |
|
multiArray: [[],], |
|
multiIndex: [0, 0, 0], |
|
name: "", |
|
} |
|
}, |
|
methods: { |
|
handleColumnChange(e) { |
|
let columnindex = e.detail.value; // 拖动列索引 |
|
switch (e.detail.column) { |
|
case 0: //拖动第1列 |
|
|
|
// 第二级 |
|
let arr1 = this.multiArray[0]; |
|
this.multiArray[1] = arr1[columnindex][this.childkey]||[]; |
|
|
|
if(this.level === 3) { |
|
// 第三级 |
|
let arr2 = this.multiArray[1]; |
|
this.multiArray[2] = arr2[0][this.childkey]||[]; |
|
} |
|
|
|
this.multiIndex.splice(0, 1, columnindex) |
|
this.multiIndex.splice(1, 1, 0) |
|
this.multiIndex.splice(2, 1, 0) |
|
break |
|
case 1: //拖动第2列 |
|
if (this.level === 3) { |
|
// 第三级 |
|
let arr3 = this.multiArray[1]; |
|
this.multiArray[2] = arr3[columnindex][this.childkey]||[]; |
|
} |
|
|
|
this.multiIndex.splice(1, 1, columnindex) |
|
this.multiIndex.splice(2, 1, 0) |
|
break |
|
} |
|
|
|
}, |
|
// |
|
pickerChange(e) { |
|
let multiIndex = e.detail.value; |
|
if(this.emitPath) { |
|
let codeArr = [], nameArr = []; |
|
for(let i = 0; i < multiIndex.length; i++ ) { |
|
if(this.multiArray[i] && this.multiArray[i][multiIndex[i]]) { |
|
codeArr.push(this.multiArray[i][multiIndex[i]][this.code]); |
|
nameArr.push(this.multiArray[i][multiIndex[i]][this.rangekey]); |
|
} |
|
} |
|
let code = codeArr.join(','); |
|
this.name = nameArr.join('/'); |
|
this.$emit('input', code) |
|
}else { |
|
|
|
let curArr = this.multiArray[2], code=''; |
|
if(curArr && curArr.length) { |
|
code = curArr[multiIndex[2]][this.code]; |
|
this.name = curArr[multiIndex[2]][this.rangekey]; |
|
}else { |
|
curArr = this.multiArray[1] |
|
code = curArr[multiIndex[1]][this.code]; |
|
this.name = curArr[multiIndex[1]][this.rangekey]; |
|
} |
|
|
|
this.$emit('input', code) |
|
} |
|
}, |
|
// 初始化级联数据 |
|
dataInit() { |
|
// 第一级 |
|
this.multiArray[0] = this.list; |
|
// 第二级 |
|
let arr1 = this.multiArray[0]; |
|
this.multiArray.push(arr1[this.multiIndex[0]][this.childkey]||[]); |
|
if(this.level === 3) { |
|
// 第三级 |
|
let arr2 = this.multiArray[1]; |
|
this.multiArray.push(arr2[this.multiIndex[1]][this.childkey]||[]); |
|
|
|
} |
|
}, |
|
curDataFind (data, code) { |
|
let result; |
|
if (!data) { |
|
data = this.list; |
|
} |
|
for (var i = 0; i < data.length; i++) { |
|
let item = data[i] |
|
if (result) { |
|
return result; |
|
} |
|
if (Number(item[this.code]) === code) { |
|
result = item; |
|
break; |
|
} else if (item[this.childkey] && item[this.childkey].length > 0) { |
|
result = this.curDataFind(item[this.childkey], code); |
|
} |
|
} |
|
return result; |
|
}, |
|
initName() { |
|
if(this.list.length && this.value) { |
|
if(this.emitPath) { |
|
let nameArr = [], codeArr = this.value.split(','); |
|
for(let i = 0; i < codeArr.length; i++ ) { |
|
codeArr[i] = codeArr[i] - 0; |
|
} |
|
for(let i = 0; i < codeArr.length; i++ ) { |
|
let item = this.curDataFind(this.list, codeArr[i]); |
|
nameArr.push(item[this.rangekey]); |
|
} |
|
this.name = nameArr.join('/'); |
|
} else { |
|
let item = this.curDataFind(this.list, this.value); |
|
this.name = item[this.rangekey]; |
|
} |
|
}else { |
|
this.name = ''; |
|
} |
|
} |
|
}, |
|
watch: { |
|
list: { |
|
immediate: true, |
|
handler(val) { |
|
if(JSON.stringify(val) != '[]'){ |
|
this.dataInit(); |
|
this.initName(); |
|
} |
|
|
|
} |
|
}, |
|
value: { |
|
// immediate: true, |
|
handler(val) { |
|
this.initName(); |
|
} |
|
}, |
|
} |
|
} |
|
</script> |
|
|
|
<style lang="scss" scoped> |
|
|
|
</style>
|
|
|