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);
}
相关推荐
掘金安东尼11 小时前
让 JavaScript 更容易「善后」的新能力
前端·javascript·面试
掘金安东尼11 小时前
用 HTMX 为 React Data Grid 加速实时更新
前端·javascript·面试
灵感__idea13 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
yinuo13 小时前
轻松接入大语言模型API -04
前端
袋鼠云数栈UED团队14 小时前
基于 Lexical 实现变量输入编辑器
前端·javascript·架构
cipher14 小时前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
UrbanJazzerati14 小时前
非常友好的Vue 3 生命周期详解
前端·面试
AAA阿giao14 小时前
从零构建一个现代登录页:深入解析 Tailwind CSS + Vite + Lucide React 的完整技术栈
前端·css·react.js
兆子龙15 小时前
像 React Hook 一样「自动触发」:用 Git Hook 拦住忘删的测试代码与其它翻车现场
前端·架构
兆子龙16 小时前
用 Auto.js 实现挂机脚本:从找图点击到循环自动化
前端·架构