一、单选
< template> < div class = " selectTree-wapper" > < el-selectv-model = " selectValue" placeholder = " 请选择" popper-class = " custom-el-select-class" ref = " selectRef" clearable @clear = " clearHandle" > < el-option :label = " selectlabel" :value = " selectValue" > < el-tree:data = " treeData" :props = " defaultProps" node-key = " id" highlight-current :check-strictly = " true" :expand-on-click-node = " true" ref = " treeRef" @node-click = " handleNodeClick" > < template #default = " { node, data }" > < span :class = " { ' special-node' : data.id === selectValue }" > {{ node.label }}</ span> </ template> </ el-tree> </ el-option> </ el-select> </ div>
</ template> < script>
export default { name: "selectTree" , components: { } , props: { } , data ( ) { return { selectlabel: "" , selectValue: "" , treeData: [ { id: "1" , name: "一级 1" , children: [ { id: "2" , name: "二级 1-1" , children: [ { id: "3" , name: "三级 1-1-1" , } , ] , } , ] , } , { id: "4" , name: "一级 2" , children: [ { id: "5" , name: "二级 2-1" , children: [ { id: "6" , name: "三级 2-1-1" , } , ] , } , { id: "7" , name: "二级 2-2" , children: [ { id: "8" , name: "三级 2-2-1" , } , ] , } , ] , } , ] , defaultProps: { children: "children" , label: "name" , } , } ; } , mounted ( ) { } , methods: { handleNodeClick ( data ) { if ( data. children && data. children. length) { return false ; } this . selectValue = data. id; this . selectlabel = data. name; this . $refs. selectRef. blur ( ) ; if ( this . $refs. treeRef) { const nodes = this . $refs. treeRef. store. _getAllNodes ( ) ; nodes. forEach ( ( node ) => { node. expanded = false ; } ) ; } } , clearHandle ( ) { this . selectValue = "" ; this . selectlabel = "" ; } , } , watch: { } ,
} ;
</ script> < style lang = ' scss' >
.custom-el-select-class { .el-select-dropdown__list { height : fit-content; max-height : 274px;.el-select-dropdown__item { height : auto; overflow : visible; padding : 0px 10px; } } .el-select-dropdown__item.hover,.el-select-dropdown__item:hover { background-color : #ffffff; } .special-node { color : red; }
}
</ style>
二、多选
< template> < div class = " selectTree-wapper" > < el-selectv-model = " selectlabel" placeholder = " 请选择" popper-class = " custom-el-select-class" ref = " selectRef" multiple collapse-tags clearable @clear = " clearHanlde" @remove-tag = " removeTag" style = " width : 300px" > < el-option :value = " selectValue" > < el-tree:data = " treeData" :props = " defaultProps" node-key = " id" show-checkbox :check-strictly = " false" :expand-on-click-node = " true" ref = " treeRef" @check-change = " handleCheckChange" > < template #default = " { node, data }" > < span :class = " { ' special-node' : data.id === selectValue }" > {{ node.label }}</ span> </ template> </ el-tree> </ el-option> </ el-select> </ div>
</ template> < script>
export default { name: "selectTree" , components: { } , props: { } , data ( ) { return { selectlabel: [ ] , selectValue: [ ] , treeData: [ { id: "1" , name: "一级 1" , children: [ { id: "2" , name: "二级 1-1" , children: [ { id: "3" , name: "三级 1-1-1" , } , ] , } , ] , } , { id: "4" , name: "一级 2" , children: [ { id: "5" , name: "二级 2-1" , children: [ { id: "6" , name: "三级 2-1-1" , } , ] , } , { id: "7" , name: "二级 2-2" , children: [ { id: "8" , name: "三级 2-2-1" , } , ] , } , ] , } , ] , defaultProps: { children: "children" , label: "name" , } , } ; } , mounted ( ) { } , methods: { handleCheckChange ( ) { const selectNodes = this . $refs. treeRef. getCheckedNodes ( ) ; const nodes = selectNodes. filter ( ( node ) => ! ( node. children && node. children. length) ) ; this . selectValue = nodes. map ( ( node ) => node. id) ; this . selectlabel = nodes. map ( ( node ) => node. name) ; } , clearHanlde ( ) { this . selectlabel = [ ] ; this . selectValue = [ ] ; } , removeTag ( tag ) { console. log ( "tag" , tag) ; this . selectValue. shift ( ) ; this . $nextTick ( ( ) => { this . $refs. treeRef. setCheckedKeys ( this . selectValue) ; } ) ; } , } , watch: { } ,
} ;
</ script> < style lang = ' scss' >
.custom-el-select-class { .el-select-dropdown__list { height : fit-content; max-height : 274px;.el-select-dropdown__item { height : auto; overflow : visible; padding : 0px 10px; } } .el-select-dropdown__item.hover,.el-select-dropdown__item:hover { background-color : #ffffff; } .special-node { color : red; }
}
</ style>
三、单选+懒加载
< template> < div class = " selectTree-wapper" > < el-selectv-model = " selectValue" placeholder = " 请选择" popper-class = " custom-el-select-class" > < el-option :label = " selectlabel" :value = " selectValue" > < el-tree:props = " props" :load = " loadNode" lazy node-key = " id" :check-strictly = " true" :expand-on-click-node = " false" @node-click = " handleNodeClick" > </ el-tree> </ el-option> </ el-select> </ div>
</ template> < script>
export default { name: "selectTree" , components: { } , props: { } , data ( ) { return { selectlabel: "" , selectValue: "" , props: { label: "name" , children: "children" , } , } ; } , mounted ( ) { } , methods: { loadNode ( node, resolve ) { let id = node. data?. id ? node. data. id : 0 ; const data = this . getLazyList ( id) ; resolve ( data || [ ] ) ; } , getLazyList ( id ) { let data = [ ] ; if ( id !== "3" ) { data = [ { id: "1" , name: "节点a" , } , { id: "2" , name: "节点b" , } , { id: "3" , name: "节点c" , } , ] ; } return data; } , handleNodeClick ( data ) { this . selectValue = data. id; this . selectlabel = data. name; } , } , watch: { } ,
} ;
</ script> < style lang = ' scss' >
.custom-el-select-class { .el-select-dropdown__list { height : fit-content; max-height : 274px;.el-select-dropdown__item { height : auto; overflow : visible; padding : 0px 10px; } } .el-select-dropdown__item.hover,.el-select-dropdown__item:hover { background-color : #ffffff; }
}
</ style>