好久没写写博客了,今天出来冒个泡
element-ui没有直接提供树形下拉框,但是用提供的下拉框和树状可以很快捷的封装一个简易版本的
今天发个简易的版本的供大家参考,如有错误或者问题可以提出,博主会虚心接受改善谢谢
HTML部分代码是简易的下拉框和树形框组合,更多的参数可自行扩展
1 <template> 2 <div class="box"> 3 <el-select size="small" placeholder="请选择" clearable v-model="selectLabel" @clear="selectClear"> 4 <el-option class="option-style" :label="selectLabel" :value="selectValue"> 5 <el-input class="search" size="small" placeholder="输入关键字进行过滤" v-model="keywork" @click.stop.native></el-input> 6 <el-tree 7 ref="tree" 8 :data="treeDate" 9 :props="treeProps" 10 :show-checkbox="showCheckbox" 11 :filter-node-method="filterNode" 12 @node-click="nodeClick" 13 @check-change="checkChange"> 14 <div slot-scope="{node, data}"> 15 <i class="el-icon-warning-outline"></i> 16 <span :class="[{'tree-click': treeClick==data.value}]">{{data.label}}</span> 17 </div> 18 </el-tree> 19 </el-option> 20 </el-select> 21 </div> 22 </template>
CSS部分代码如下
1 .box{ 2 width: 100%; 3 height: 100%; 4 margin: 1rem; 5 } 6 .search{ 7 width: calc(100% - 8px - 0.5rem); 8 margin: 0 0.5rem; 9 } 10 .option-style{ 11 padding: 0; 12 width: 100%; 13 height: 100%; 14 background-color: #FFFFFF; 15 } 16 .tree-click{ 17 color: #4D74D6; 18 font-weight: 600; 19 } 20 /deep/ .el-tree-node__content{ 21 padding: 0.25rem; 22 } 23 /deep/ .el-icon-caret-right{ 24 font-size: 0; 25 }
JS部分代码如下
1 <script> 2 export default{ 3 name: "test", 4 components: { 5 6 }, 7 data(){ 8 return{ 9 treeClick: null, //点击样式 10 keywork: null, //搜索关键字 11 selectLabel: null, //下拉框显示名称 12 selectValue: null, //下拉框显示ID 13 treeDate: [ 14 {label: "主-测试0", value: 0, children: [ 15 {label: "子-测试0", value: 6} 16 ]}, 17 {label: "主-测试1", value: 1, children: [ 18 {label: "子-测试1", value: 7} 19 ]}, 20 {label: "主-测试2", value: 2, children: [ 21 {label: "子-测试2", value: 8} 22 ]}, 23 {label: "主-测试3", value: 3, children: [ 24 {label: "子-测试3", value: 9} 25 ]}, 26 {label: "主-测试4", value: 4, children: [ 27 {label: "子-测试4", value: 10} 28 ]}, 29 {label: "主-测试5", value: 5, children: [ 30 {label: "子-测试6", value: 11}, 31 {label: "子-测试7", value: 12} 32 ]} 33 ], 34 treeProps: { 35 children: "children", 36 label: "label" 37 } 38 } 39 }, 40 props:{ 41 // treeDate: {//树状数据 42 // type: Array, 43 // default: ()=>{} 44 // }, 45 // treeProps: {//树状规则 46 // type: Object, 47 // default: ()=>{} 48 // }, 49 showCheckbox: {//是否可选择 50 type: Boolean, 51 default: true 52 } 53 }, 54 methods:{ 55 selectClear(){ 56 this.treeClick = null; 57 this.selectLabel = null; 58 this.selectValue = null; 59 }, 60 filterNode(value, data){ 61 if(!value){ 62 return true; 63 } 64 return data.label.indexOf(value) !== -1; 65 }, 66 nodeClick(obj, node){ 67 this.treeClick = obj.value; 68 this.selectLabel = obj.label; 69 this.selectValue = obj.value; 70 console.log(obj, node); 71 }, 72 checkChange(obj, node){ 73 console.log(obj, node); 74 }, 75 }, 76 watch:{ 77 keywork(val){ 78 this.$refs.tree.filter(val); 79 } 80 }, 81 computed:{ 82 83 }, 84 created(){ 85 86 }, 87 mounted(){ 88 89 }, 90 beforeDestroy(){ 91 92 } 93 } 94 </script>
完整代码如下
1 <template> 2 <div class="box"> 3 <el-select size="small" placeholder="请选择" clearable v-model="selectLabel" @clear="selectClear"> 4 <el-option class="option-style" :label="selectLabel" :value="selectValue"> 5 <el-input class="search" size="small" placeholder="输入关键字进行过滤" v-model="keywork" @click.stop.native></el-input> 6 <el-tree 7 ref="tree" 8 :data="treeDate" 9 :props="treeProps" 10 :show-checkbox="showCheckbox" 11 :filter-node-method="filterNode" 12 @node-click="nodeClick" 13 @check-change="checkChange"> 14 <div slot-scope="{node, data}"> 15 <i class="el-icon-warning-outline"></i> 16 <span :class="[{'tree-click': treeClick==data.value}]">{{data.label}}</span> 17 </div> 18 </el-tree> 19 </el-option> 20 </el-select> 21 </div> 22 </template> 23 24 <script> 25 export default{ 26 name: "test", 27 components: { 28 29 }, 30 data(){ 31 return{ 32 treeClick: null, //点击样式 33 keywork: null, //搜索关键字 34 selectLabel: null, //下拉框显示名称 35 selectValue: null, //下拉框显示ID 36 treeDate: [ 37 {label: "主-测试0", value: 0, children: [ 38 {label: "子-测试0", value: 6} 39 ]}, 40 {label: "主-测试1", value: 1, children: [ 41 {label: "子-测试1", value: 7} 42 ]}, 43 {label: "主-测试2", value: 2, children: [ 44 {label: "子-测试2", value: 8} 45 ]}, 46 {label: "主-测试3", value: 3, children: [ 47 {label: "子-测试3", value: 9} 48 ]}, 49 {label: "主-测试4", value: 4, children: [ 50 {label: "子-测试4", value: 10} 51 ]}, 52 {label: "主-测试5", value: 5, children: [ 53 {label: "子-测试6", value: 11}, 54 {label: "子-测试7", value: 12} 55 ]} 56 ], 57 treeProps: { 58 children: "children", 59 label: "label" 60 } 61 } 62 }, 63 props:{ 64 // treeDate: {//树状数据 65 // type: Array, 66 // default: ()=>{} 67 // }, 68 // treeProps: {//树状规则 69 // type: Object, 70 // default: ()=>{} 71 // }, 72 showCheckbox: {//是否可选择 73 type: Boolean, 74 default: true 75 } 76 }, 77 methods:{ 78 selectClear(){ 79 this.treeClick = null; 80 this.selectLabel = null; 81 this.selectValue = null; 82 }, 83 filterNode(value, data){ 84 if(!value){ 85 return true; 86 } 87 return data.label.indexOf(value) !== -1; 88 }, 89 nodeClick(obj, node){ 90 this.treeClick = obj.value; 91 this.selectLabel = obj.label; 92 this.selectValue = obj.value; 93 console.log(obj, node); 94 }, 95 checkChange(obj, node){ 96 console.log(obj, node); 97 }, 98 }, 99 watch:{ 100 keywork(val){ 101 this.$refs.tree.filter(val); 102 } 103 }, 104 computed:{ 105 106 }, 107 created(){ 108 109 }, 110 mounted(){ 111 112 }, 113 beforeDestroy(){ 114 115 } 116 } 117 </script> 118 119 <style scoped> 120 .box{ 121 width: 100%; 122 height: 100%; 123 margin: 1rem; 124 } 125 .search{ 126 width: calc(100% - 8px - 0.5rem); 127 margin: 0 0.5rem; 128 } 129 .option-style{ 130 padding: 0; 131 width: 100%; 132 height: 100%; 133 background-color: #FFFFFF; 134 } 135 .tree-click{ 136 color: #4D74D6; 137 font-weight: 600; 138 } 139 /deep/ .el-tree-node__content{ 140 padding: 0.25rem; 141 } 142 /deep/ .el-icon-caret-right{ 143 font-size: 0; 144 } 145 </style>