218 lines
6.5 KiB
Vue
218 lines
6.5 KiB
Vue
<template>
|
|
<el-select
|
|
class="user-select-tree"
|
|
v-model="textStr"
|
|
:placeholder="placeholder"
|
|
ref="select"
|
|
:filterable="true"
|
|
:clearable="clearable"
|
|
@clear="clearSelect"
|
|
@visible-change="visibleChange"
|
|
:popper-append-to-body="false"
|
|
style="width: 100%"
|
|
>
|
|
<el-option
|
|
v-model="value"
|
|
style="
|
|
height: 100%;
|
|
max-height: 200px;
|
|
overflow-y: auto;
|
|
padding: 0;
|
|
background-color: #ffffff;
|
|
"
|
|
>
|
|
<el-tree
|
|
:data="treeList"
|
|
:props="treeProps"
|
|
:filter-node-method="filterNode"
|
|
:current-node-key="currentKey"
|
|
highlight-current
|
|
default-expand-all
|
|
:node-key="nodeKey"
|
|
ref="selectTree"
|
|
:check-strictly="true"
|
|
@node-click="handleTreeClick"
|
|
>
|
|
<span
|
|
slot-scope="{ data }"
|
|
:title="data[treeProps.label]"
|
|
class="ellipsis"
|
|
>
|
|
{{ data[treeProps.label] }}
|
|
</span>
|
|
</el-tree>
|
|
</el-option>
|
|
</el-select>
|
|
</template>
|
|
<script>
|
|
export default {
|
|
name: 'index',
|
|
props: {
|
|
treeList: {
|
|
type: Array,
|
|
}, //树形原始数据
|
|
treeProps: Object, //树形配置
|
|
nodeKey: String, //树形唯一键值
|
|
defaultSelect: {
|
|
//默认选择
|
|
type: Boolean,
|
|
default: true,
|
|
},
|
|
defaultData: {
|
|
type: Object,
|
|
default: null,
|
|
},
|
|
clearable: { type: Boolean, default: false },
|
|
placeholder: { type: String, default: '请选择' },
|
|
},
|
|
data() {
|
|
return {
|
|
textStr: '',
|
|
value: '',
|
|
filterText: '',
|
|
currentKey: '',
|
|
highlightNode: -1,
|
|
}
|
|
},
|
|
watch: {
|
|
// clearable(val) {
|
|
// console.log('val-----', val);
|
|
// },
|
|
clearable: {
|
|
handler: function (val, old) {},
|
|
// 立即以obj.name的当前值触发回调
|
|
immediate: true,
|
|
},
|
|
filterText(val) {
|
|
this.$refs.selectTree.filter(val)
|
|
},
|
|
defaultData(val) {
|
|
if (this.highlightNode === -1) {
|
|
this.setEdit(val)
|
|
}
|
|
},
|
|
treeList(val) {
|
|
if (val.length > 0) {
|
|
this.$nextTick(() => {
|
|
if (this.defaultSelect) {
|
|
this.value =
|
|
val[0][this.treeProps.children][0][this.nodeKey]
|
|
this.textStr =
|
|
val[0][this.treeProps.children][0][
|
|
this.treeProps.label
|
|
]
|
|
this.highlightNode = this.value
|
|
this.currentKey = this.value
|
|
this.$refs.selectTree.setCurrentKey(this.highlightNode)
|
|
this.$emit('handleNodeClick', this.value)
|
|
}
|
|
})
|
|
}
|
|
},
|
|
},
|
|
methods: {
|
|
setEdit(obj) {
|
|
if (obj.name !== '' && obj.value !== '') {
|
|
this.value = obj.value
|
|
this.textStr = obj.name
|
|
this.$nextTick(() => {
|
|
this.highlightNode = this.value
|
|
this.currentKey = this.value
|
|
this.$refs.selectTree.setCurrentKey(this.highlightNode)
|
|
})
|
|
}
|
|
},
|
|
visibleChange() {
|
|
this.filterText = ''
|
|
},
|
|
filterNode(value, data) {
|
|
if (!value) return true
|
|
return data[this.treeProps.label].indexOf(value) !== -1
|
|
},
|
|
remoteMethod(query) {
|
|
setTimeout(() => {
|
|
this.filterText = query
|
|
}, 100)
|
|
},
|
|
// 设备类型点击赋值
|
|
handleTreeClick(data, checked) {
|
|
this.filterText = ''
|
|
if (checked) {
|
|
// //判断是否是父子
|
|
if (
|
|
data[this.treeProps.children] !== undefined &&
|
|
data[this.treeProps.children].length !== 0
|
|
) {
|
|
this.$refs.selectTree.setCurrentKey(this.highlightNode)
|
|
} else {
|
|
this.value = data[this.nodeKey]
|
|
this.textStr = data[this.treeProps.label]
|
|
this.$forceUpdate()
|
|
this.currentKey = this.value
|
|
this.highlightNode = data[this.nodeKey]
|
|
this.$emit('handleNodeClick', this.value)
|
|
this.$refs.selectTree.setCheckedKeys([this.highlightNode])
|
|
this.$refs.select.blur()
|
|
}
|
|
}
|
|
},
|
|
clearFun() {
|
|
this.value = null
|
|
this.textStr = null
|
|
this.currentKey = undefined
|
|
this.highlightNode = undefined
|
|
this.$refs.selectTree.setCurrentKey(this.highlightNode)
|
|
this.$refs.select.clearSingleSelect()
|
|
// this.value = ''
|
|
// this.textStr = ''
|
|
// this.currentKey = undefined
|
|
// this.highlightNode = undefined
|
|
// this.$refs.selectTree.setCurrentKey(this.highlightNode)
|
|
},
|
|
clearSelect() {
|
|
this.value = ''
|
|
this.textStr = ''
|
|
this.$refs.selectTree.setCurrentKey()
|
|
this.$emit('handleNodeClick', '')
|
|
},
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.user-select-tree {
|
|
// ::v-deep {
|
|
// .el-icon-::before {
|
|
// content: '\ea1b';
|
|
// font-family: 'icomoon' !important;
|
|
// display: inline-block;
|
|
// -webkit-transform: scale(0.83);
|
|
// font-size: 10px;
|
|
// //width: 100%;
|
|
// //height: 100%;
|
|
// color: #666666;
|
|
// pointer-events: none;
|
|
// }
|
|
|
|
// .el-input.is-focus {
|
|
// .el-icon- {
|
|
// transform: rotate(0deg);
|
|
// }
|
|
// }
|
|
|
|
// .el-input__inner {
|
|
// height: 36px;
|
|
// line-height: 36px;
|
|
// }
|
|
|
|
// .el-input__icon {
|
|
// line-height: 36px;
|
|
// }
|
|
|
|
// .el-tree-node__content {
|
|
// height: 32px;
|
|
// }
|
|
// }
|
|
}
|
|
</style>
|