elementui的el-select+el-tree+el-input实现可搜索的下拉树组件

部分实现代码如下

css 复制代码
<template>
<div>
 <el-select
              v-model="item.TableName"
              placeholder="请选择"
              :disabled="!item.disabled"
              @visible-change="handleVisible"
              ref="TableName"
            >
              <el-input placeholder="请输入关键词" v-model="inputValue" maxlength="40">
                <i slot="suffix" class="el-input__icon el-icon-search" @click="getTreeData"></i>
              </el-input>
              <el-option :value="item.TableName" style="height: 200px; overflow-y: auto">
                <el-tree
                  v-loading="loading"
                  :data="treeData"
                  :index="index"
                  :props="defaultProps"
                  :default-expand-all="expandAll"
                  node-key="puid"
                  highlight-current
                  v-if="refreshTree"
                  @node-click="
                    (data, node, item) =>
                      handleNodeClick(data, node, item, index, 'TableName')
                  "
                />
              </el-option>
            </el-select>
</div>
</template>
javascript 复制代码
在这里插入代码片
javascript 复制代码
<script>
export default {
  name: '',
  components: {},
  props: {
    defaultProps: { type: Object, default: () => ({}) },
    treeData: { type: Array, required: true, default: () => [] },
  },
  data() {
    return {
      inputValue: '', //树搜索值
  

      expandAll: false, //搜索后全部展开
      refreshTree: true,
      loading: false,
    };
  },
  computed: {},
  methods: {
    // 树模型选中后触发,选中数据赋值到下拉框,判断是否有重复数据,重复的话提示
    handleNodeClick(data, node, item, index, position) {
    操作:自定义
      // 选择后收起下拉菜单
      setTimeout(() => {
        this.$refs[position][index].blur();
      }, 50);
    },
    // 筛选树模型数据;触发父组件搜索接口,修改this.treeData数值即可
    getTreeData() {
      this.loading = true;
     
    },
    // 下拉框出现或隐藏清空输入框值,重新获取所有treeData
    handleVisible() {
      this.inputValue = '';
  
    },
    
   
  },
  watch: {
    // 更新属性
    inputValue: {
      handler(newVal, oldVal) {
        if (newVal !== oldVal) {
         
          // 再次重新请求数据接口即可
        }
      },
      immediate: true,
      deep: true,
    },
  },
 
};
</script>
css 复制代码
<style lang="scss">
.el-input-group__append,
.el-input-group__prepend {
  padding: 0;
  background: #ffffff;
  font-size: 14px;
}
.el-input-group {
  width: 88%;
  padding: 10px 18px;
}
.el-icon-caret-right:before {
  content: '\e6e0';
}
.el-select-dropdown__item.hover,
.el-select-dropdown__item:hover {
  background: #ffffff;
}
.el-select-dropdown__item {
  padding: 10px 0 0 0;

}
.el-select-dropdown__list {
  padding: 6px 20px;
}
.el-scrollbar__bar.is-vertical {
  display: none;
}
.el-input__icon {
  transform: scale(1.5);
}
相关推荐
JosieBook1 小时前
【web应用】如何进行前后端调试Debug? + 前端JavaScript调试Debug?
前端·chrome·debug
LBJ辉1 小时前
2. Webpack 高级配置
前端·javascript·webpack
灵感__idea7 小时前
JavaScript高级程序设计(第5版):好的编程就是掌控感
前端·javascript·程序员
烛阴8 小时前
Mix
前端·webgl
代码续发9 小时前
前端组件梳理
前端
试图让你心动9 小时前
原生input添加删除图标类似vue里面移入显示删除[jquery]
前端·vue.js·jquery
_Kayo_9 小时前
VUE2 学习笔记6 vue数据监测原理
vue.js·笔记·学习
陈不知代码10 小时前
uniapp创建vue3+ts+pinia+sass项目
前端·uni-app·sass
小王码农记10 小时前
sass中@mixin与 @include
前端·sass
陈琦鹏10 小时前
轻松管理 WebSocket 连接!easy-websocket-client
前端·vue.js·websocket