当前位置: 首页 > news >正文

一个根据输入内容过滤下拉选的组件

1.element的select自定义过滤不是很灵,使用了input和dropdown

组件

<template>
  <div class="autocomplete-wrapper">
    <!-- 使用 el-input 组件 -->
    <el-input
      v-model="inputValue"
      @input="handleInput"

      placeholder="请输入内容"
    />

    <!-- 使用 el-dropdown 自定义下拉框 -->
    <el-dropdown
      ref="dropdown1"
      trigger="manual"
      placement="bottom-start"
      popper-class="autocomplete-dropdown"
    >
      <div class="menu_title">55555</div>
      <!-- 空 div 作为触发元素 -->
      <template #dropdown>
        <ul class="suggestions">
          <li
            v-for="item in filteredOptions"
            :key="item[valueStr]"
            @click="selectOption(item[valueStr])"
          >{{ item[valueStr] }}</li>
        </ul>
      </template>
    </el-dropdown>
  </div>
</template>
  
  <script setup>
import { ref, computed, onMounted } from "vue";
const { proxy } = getCurrentInstance();
defineProps({
//接口参数
  options: {
    type: Array,
    default: true,
  },
//input关联的变量
  inputValue:{
    type: String,
    default: "",  
  },
//接口地址
  oprionUrl: {
    type: String,
    default: "",
  },
//option需要展示的属性名
  valueStr:{
    type:String,
    default:"name"
  }
});
// const inputValue = ref("")
const emit = defineEmits(["setInput"]);
getDeviceCodeList();
let allDeviceCodeList = [];
function getDeviceCodeList() {}

// 过滤后的选项
const filteredOptions = ref([]);

// 输入处理
 function handleInput (input)  {
  proxy
    .$get(proxy.oprionUrl,)
    .then((res) => {
      allDeviceCodeList = res.records;
      filteredOptions.value = []
      let arr = input.split("");
      let regx = "";
      arr.forEach((element) => {
        regx += `(${element})(.)*`;
      });
      let regxN = new RegExp(regx);
      allDeviceCodeList.forEach((item) => {
        if (regxN.test(item[proxy.valueStr])) {
          filteredOptions.value.push(item);
        }
      });
      if(filteredOptions.value.length>0){
        openDropdown()
      }
    });
};

// 选择选项
const selectOption = (value) => {

  closeDropdown()
  emit("setInput", value);
};

// 关闭下拉框
const closeDropdown = () => {
  proxy.$refs.dropdown1.handleClose();
};

// 打开下拉框
const openDropdown = () => {
  proxy.$refs.dropdown1.handleOpen();
};
</script>
  
  <style scoped>
.autocomplete-wrapper {
  position: relative;
  width: 120px;
}
.menu_title{
    position: absolute;
    top:20px;
    left: -120px;
    opacity: 0;
}
.suggestions {
  width: 300px;
  max-height: 200px;
  overflow-y: auto;
  margin: 0;
  padding: 0;
  border: 0px solid #292626;
  border-radius: 4px;
  background: rgb(8, 42, 84);
  color: #ffffff;
  list-style: none;
}

.suggestions li {
  padding: 8px;
  cursor: pointer;
}

.suggestions li:hover,
.highlighted {
  background-color: rgb(3, 85, 159);
}

mark {
  background-color: yellow;
  padding: 0;
}
</style>

父组件使用

handleSelect赋值

<template>

      <SI
      :options="queryParams"
      :oprionUrl="url"
      :inputValue="queryParams.input"
      valueStr="optionValue"
      @setInput="handleSelect"
      />
</template>
<script setup>
import SI from "./SI.vue"
function handleSelect(params) {
  proxy.queryParams.deviceCode = params
}

</script>

相关文章:

  • 网络编程-
  • 设计模式Python版 命令模式(下)
  • Keysight E5071C (Agilent) 网络分析仪的特性和规格
  • DeepSeek 本地部署(电脑安装)
  • 笔试题笔记#6 模拟三道题和总结知识
  • CTF-web:java-h2 堆叠注入rce -- N1ctf Junior EasyDB
  • 消息中间件深度剖析:以 RabbitMQ 和 Kafka 为核心
  • vue2和vue3响应式区别最通俗易懂的理解
  • 图文教程 | 2024年IDEA安装使用教程,JDK简易下载方法
  • SpringBoot 统一功能处理
  • 面试经典150题——分治
  • SkyWalking 10.1.0 实战:从零构建全链路监控,解锁微服务性能优化新境界
  • element-ui时间组件同一个月内选择/30天内选择
  • AI 学习入门之概述篇
  • KEPServerEX 的接口类型与连接方式的详细说明
  • 基于和声搜索(Harmony Search, HS)的多中心点选址优化算法matlab仿真
  • Flutter_学习记录_动画的简单了解
  • 【华为OD机考】华为OD笔试真题解析(7)--基站维修工程师
  • 【Qt】实现定期清理程序日志
  • 排序算法详解、应用对比与C语言实现
  • 墨海军训练舰在纽约撞桥,墨总统:对遇难者表示悲痛,将跟进调查
  • 北斗系统全面进入11个国际组织的标准体系
  • 15年全程免费,内蒙古准格尔旗实现幼儿园到高中0学费
  • 著名文博专家吴远明因交通事故离世,享年75岁
  • 高飞已任南航集团党组副书记
  • 辽宁援疆前指总指挥王敬华已任新疆塔城地委副书记