【VUE】基于element 的 tree封装select选项框
html部分代码:
<template>
<el-select
:value="currentLabel"
:disabled="disabled"
:clearable="clearable"
@clear="clearHandle">
<el-option :value="currentLabel" :label="currentLabel">
<el-tree id="tree-option"
ref="selectTree"
:expand-on-click-node="false"
:accordion="accordion"
:data="options"
:props="props"
:node-key="props.value"
:default-expanded-keys="defaultExpandedKey"
@node-click="handleNodeClick">
</el-tree>
</el-option>
</el-select>
</template>
js代码:
<script>
export default {
name: 'select-tree',
props:{
/* 配置项 */
props:{
type: Object,
default:()=>{
return {
value:'id', // ID字段名
label: 'title', // 显示名称
children: 'children' // 子级字段名
}
}
},
/* 选项列表数据(树形结构的对象数组) */
options:{
type: Array,
default: ()=>{ return [] }
},
/* 初始值 */
value:{
type: [String, Number],
default: ()=>{ return null }
},
/* 可清空选项 */
clearable:{
type:Boolean,
default:()=>{ return false }
},
/* 自动收起 */
accordion:{
type:Boolean,
default:()=>{ return false }
},
disabled: {
type:Boolean,
default:()=>{ return false }
}
},
data() {
return {
valueId: this.value,
currentLabel:'',
defaultExpandedKey:[]
}
},
mounted(){
this.initHandle()
},
methods: {
// 初始化值
initHandle(){
let that = this
setTimeout(function() {
if(that.valueId){
let currid= that.valueId.toString()
that.currentLabel = that.$refs.selectTree.getNode(currid).data[that.props.label] // 初始化显示
that.$refs.selectTree.setCurrentKey(currid) // 设置默认选中
that.defaultExpandedKey = [currid] // 设置默认展开
} else {
that.currentLabel = null // 初始化显示
that.$refs.selectTree.setCurrentKey(null) // 设置默认选中
}
},200)
this.$nextTick(()=>{
let scrollWrap = document.querySelectorAll('.el-scrollbar .el-select-dropdown__wrap')[0]
let scrollBar = document.querySelectorAll('.el-scrollbar .el-scrollbar__bar')
scrollWrap.style.cssText = 'margin: 0px; max-height: none; overflow: hidden;'
scrollBar.forEach(ele => ele.style.width = 0)
})
},
// 切换选项
handleNodeClick(node){
this.currentLabel = node[this.props.label]
this.valueId = node[this.props.value]
//this.$emit('getValue',this.valueId)
this.$emit('input',this.valueId)
this.defaultExpandedKey = []
},
// 清除选中
clearHandle(){
this.currentLabel = ''
this.valueId = null
this.defaultExpandedKey = []
this.clearSelected()
//this.$emit('getValue',null)
this.$emit('input',null)
},
/* 清空选中样式 */
clearSelected(){
let allNode = document.querySelectorAll('#tree-option .el-tree-node')
allNode.forEach((element)=>element.classList.remove('is-current'))
}
},
watch: {
value(){
this.valueId = this.value
this.initHandle()
}
}
}
</script>
css样式表:
<style scoped>
.el-scrollbar .el-scrollbar__view .el-select-dropdown__item{
height: auto;
max-height: 274px;
padding: 0;
overflow: hidden;
overflow-y: auto;
}
.el-select-dropdown__item.selected{
font-weight: normal;
}
ul li >>>.el-tree .el-tree-node__content{
height:auto;
padding: 0 20px;
}
.el-tree-node__label{
font-weight: normal;
}
.el-tree >>>.is-current .el-tree-node__label{
color: #409EFF;
font-weight: 700;
}
.el-tree >>>.is-current .el-tree-node__children .el-tree-node__label{
color:#606266;
font-weight: normal;
}
</style>
引用:
<select-tree
:props="treeSelectProps"
v-model="editForm.parentid"
:options="treeData"
v-bind:disabled="false">
</select-tree>
喜欢别忘点个赞。❥(^_-)