基于vue element-ui的树形下拉选择器
参考:https://blog.csdn.net/Mr_JavaScript/article/details/88604270
作了2点改进:
1.选中后关闭
// 切换选项 handleNodeClick(node){ this.valueTitle = node[this.props.label] this.valueId = node[this.props.value] this.$emit('getValue',this.valueId) this.defaultExpandedKey = [] this.$refs.select.blur() //选中后关闭 },
2.当找不到指定节点时清空
initHandle(){ if(this.valueId){ var node = this.$refs.selectTree.getNode(this.valueId) if(node){ this.valueTitle = this.$refs.selectTree.getNode(this.valueId).data[this.props.label] // 初始化显示 this.$refs.selectTree.setCurrentKey(this.valueId) // 设置默认选中 this.defaultExpandedKey = [this.valueId] // 设置默认展开 } } else{ this.clearHandle() // 如果valueId不存在,清除选中 } this.initScroll() }
使用:
<tree-select :props="optionProps" :options="treeOptions" v-model="dlgData.pid" :accordion="true" :clearable="false"/>
组件源码:
<template> <el-select ref="select" :value="valueTitle" :clearable="clearable" @clear="clearHandle"> <el-option :value="valueTitle" :label="valueTitle" class="options"> <el-tree ref="selectTree" :accordion="accordion" :data="options" :props="props" :node-key="props.value" :default-expanded-keys="defaultExpandedKey" @node-click="handleNodeClick"> </el-tree> </el-option> </el-select> </template> <script> export default { name: "el-tree-select", props:{ // 配置项 props:{ type: Object, default: { value:'id', // ID字段名 label: 'title', // 显示名称 children: 'children' // 子级字段名 } }, // 选项列表数据(树形结构的对象数组) options:{ type: Array, default: [] }, // 初始值 value:{ type: Number, default: null }, // 可清空选项 clearable:{ type:Boolean, default: true }, // 自动收起 accordion:{ type:Boolean, default: false } }, data() { return { valueId: null, valueTitle:'', defaultExpandedKey:[] } }, mounted(){ this.valueId = this.value, // 初始值 this.initHandle() }, methods: { // 初始化值 initHandle(){ if(this.valueId){ var node = this.$refs.selectTree.getNode(this.valueId) if(node){ this.valueTitle = this.$refs.selectTree.getNode(this.valueId).data[this.props.label] // 初始化显示 this.$refs.selectTree.setCurrentKey(this.valueId) // 设置默认选中 this.defaultExpandedKey = [this.valueId] // 设置默认展开 } } else{ this.clearHandle() // 如果valueId不存在,清除选中 } this.initScroll() }, // 初始化滚动条 initScroll(){ 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.valueTitle = node[this.props.label] this.valueId = node[this.props.value] this.$emit('getValue',this.valueId) this.defaultExpandedKey = [] this.$refs.select.blur() }, // 清除选中 clearHandle(){ this.valueTitle = '' this.valueId = null this.defaultExpandedKey = [] this.clearSelected() this.$emit('getValue',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> <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>