• 基于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
    id="tree-option"
    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>
  • 相关阅读:
    PAT乙级真题1004. 成绩排名 (20)(解题)
    PAT乙级真题1003. 我要通过!(20)(解题)
    PAT乙级真题1002. 写出这个数 (20)(解题)
    PAT乙级真题1001. 害死人不偿命的(3n+1)猜想 (15)(解题)
    2015-03-06——ajax基础
    2015-03-06——正则表达式基础
    2015-02-09——js笔记
    2015-02-08——js笔记
    2015-02-07——js笔记
    2014-10-28——iframe多层嵌套时获取元素总结
  • 原文地址:https://www.cnblogs.com/zhengwk/p/14078232.html
Copyright © 2020-2023  润新知