Vue3+ElementPlus实例_select选择器(不连续搜索)

news2024/11/20 8:28:18

1.开发需求

在各大UI框架的select选择器中,在搜索时都是输入连续的搜索内容,比如“app-store”选项,你要输入“app-xxx”,才能匹配这个选择,要是想输入“a-s”这种不连续的匹配方式,就实现不了,用户体验较差,所以就开发了一个不连续搜索的select选择器,并带有输入内容的高亮提示。

2.实现演示

下面是我完成后的演示,请看

3.主要难点

        1.如何不连续匹配选项

        这里我们借用了一下第三方的api库——sdm2

        2.匹配的代码逻辑  

 我这里做成了通用组件的模式:

点个赞呗~

4.代码

        子组件代码

<template>
  <!-- 非连续搜索下拉组件 -->
  <el-select v-model="value" :clearable="clearable" filterable placeholder="请选择" :filter-method="(q) => (query = q)"
    @change="selectChange">
    <el-option v-for="item in filteredOptions" :key="item.value" :label="item.label" :value="item.value">
      <div v-if="props.isHigh" v-html="item.highlight"></div>
    </el-option>
  </el-select>
</template>

<script setup lang="ts">
import { ref, computed } from "vue";
import { match, filterMap } from "sdm2";

const props = defineProps({
  selectValue: { type: String, default: '' }, //选中值
  clearable: { type: Boolean, default: true }, //是否可清除
  options: { type: Array<any>, default: [] },//选项
  isHigh: { type: Boolean, default: false }, //是否高亮
  highlightColor: { type: String, default: 'red' },//高亮颜色
});
const query = ref("");
const value = ref(props.selectValue);
const emits = defineEmits(["update:selectValue"]);

// 格式化选项
const filteredOptions = computed(() => {
  if (!props.isHigh) {
    let optionsList = props.options.filter(({ label }) =>
      // 使用sdm2的match函数筛选
      match(label, query.value, {
        // 忽略大小写匹配
        ignoreCase: true,
      })
    )
    return optionsList;
  } else {
    let optionsList = filterMap(props.options, query.value, {
      // 忽略大小写匹配
      ignoreCase: true,
      // 把matchStr返回的字符串作为被匹配项
      matchStr: ({ label }) => label,
      // 匹配到后转换为html高亮字符串
      onMatched: (matchedStr) =>
        `<span style="color:${props.highlightColor}" class="highlight">${matchedStr}</span>`,
      // 将匹配到的项转换为所需要的格式,str为onMatched转换后的字符串,origin为原始项
      onMap: ({ str, origin }) => {
        return {
          highlight: str,
          ...origin,
        };
      },
    })
    return optionsList;
  }
}
);
// 选中值
function selectChange() {
  emits("update:selectValue", value.value);
}
</script>
<style lang="less" scoped></style>

父组件代码:

<template>
  <!-- 非连续下拉搜索框 -->
  <div class="discontinuous-select">
    <span>高亮颜色 </span>
    <el-color-picker v-model="highlightColor" />
    <p></p>
    <span>是否高亮 </span>
    <el-radio-group v-model="isHigh">
      <el-radio :label="true">是</el-radio>
      <el-radio :label="false">否</el-radio>
    </el-radio-group>
    <p></p>
    <span>组件模式 </span>
    <DisSelect v-model:selectValue="selectValue" :options="options" :isHigh="isHigh" :highlightColor="highlightColor">
    </DisSelect>
  </div>
</template>

<script setup lang="ts">
import { ref, computed, watch } from "vue";
import DisSelect from './components/DisSelect.vue'
const options = ref([
  {
    label: "Apple",
    value: "apple",
  },
  {
    label: "Banana",
    value: "banana",
  },
  {
    label: "Fig",
    value: "fig",
  },
  {
    label: "Grape",
    value: "grape",
  },
  {
    label: "Lemon",
    value: "lemon",
  },
  {
    label: "Mango",
    value: "mango",
  },
  {
    label: "Orange",
    value: "orange",
  },
  {
    label: "Pineapple",
    value: "pineapple",
  },
]);

// 组件模式
const selectValue = ref("");
// 高亮颜色
const highlightColor = ref('#FF0000')
// 是否高亮
const isHigh = ref(true);
watch((selectValue), (newVal, oldVal) =>
  console.log("selectValue", newVal)
);
</script>
<style lang="less" scoped>
.discontinuous-select {
  height: 100%;
  width: 100%;
  text-align: center;
}
</style>

点个赞呗~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1389449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MATLAB】Linux版本 高分辨率屏 调整显示缩放

0 引言 安装了linux版本的MATLAB R2023b之后&#xff0c;发现工具栏字体很小不方便使用&#xff0c;所以上网找到了MATLAB论坛上某位大佬的教程&#xff1a;参考链接&#xff0c;放在这里供各位参考 。 1 环境 这里注明我的matlab安装环境仅供参考&#xff0c;未在其他环境下…

搭建知识付费小程序平台:如何避免被坑,选择最佳方案?

随着知识经济的兴起&#xff0c;知识付费已经成为一种趋势。越来越多的人开始将自己的知识和技能进行变现&#xff0c;而知识付费小程序平台则成为了一个重要的渠道。然而&#xff0c;市面上的知识付费小程序平台琳琅满目&#xff0c;其中不乏一些不良平台&#xff0c;让老实人…

【MATLAB随笔】遗传算法优化的BP神经网络(随笔,不是很详细)

文章目录 一、算法思想1.1 BP神经网络1.2 遗传算法1.3 遗传算法优化的BP神经网络 二、代码解读2.1 数据预处理2.2 GABP2.3 部分函数说明 一、算法思想 1.1 BP神经网络 BP神经网络&#xff08;Backpropagation Neural Network&#xff0c;反向传播神经网络&#xff09;是一种监…

多特征变量序列预测(五) CEEMDAN+CNN-LSTM风速预测模型

目录 ​编辑 往期精彩内容&#xff1a; 前言 1 多特征变量数据集制作与预处理 1.1 导入数据 1.2 CEEMDAN分解 1.3 数据集制作与预处理 2 基于Pytorch的CEEMDAN CNN-LSTM 预测模型 2.1 定义CEEMDAN CNN-LSTM预测模型 2.2 设置参数&#xff0c;训练模型 3 模型评估与…

Spring Aop原理

Aop概述 Spring 中 Aop的理解&#xff1a; AOP:将那些与业务无关&#xff0c;却与业务模块所共同调用的逻辑(例如事务处理&#xff0c;日志管理&#xff0c;权限管理等) 封装成一个可重用的模块&#xff0c;这个模块被称为"切面"&#xff0c;便于减少系统的重复代码…

立体声耳机功率放大器电路D7000,静态电流低且电源纹波抑制比高

立体声耳机功率放大器电路-D7000&#xff0c;静态电流低&#xff0c;电源纹波抑制比高&#xff0c;内置节电模式开关和静噪开关&#xff0c;主要应用于便携式视盘播放器(DISCMAN),便携式迷你播放器(MD),Disc-Man,MP3 播放器,CD-ROM以及其它便携式Disc风扇马达驱动器等领域。 二…

C#,入门教程(20)——列表(List)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(19)——循环语句&#xff08;for&#xff0c;while&#xff0c;foreach&#xff09;的基础知识https://blog.csdn.net/beijinghorn/article/details/124060844 List顾名思义就是数据列表&#xff0c;区别于数据数组&#xff08;arr…

windows系统下docker软件中使用ubuntu发行版本的linux系统

1.软件下载 官网下载地址 下载安装之后&#xff0c;再去微软商店下载wsl软件&#xff0c;可以直接用&#xff0c;或者也可以使用命令行拉取&#xff08;下面会讲&#xff09; 2.在docker里面创建容器的两种方法 2.1.命令行创建 前言&#xff1a;输入 winr 打开命令行进行下面…

USB Redirector本地安装并结合内网穿透实现远程共享和访问USB设备

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 USB Redirector是一款方便易用的USB设备共享服务应用程序&#xff0c;它提供了共享和访问本地或互联网上的U…

【PUSDN】MySQL数据库建表规范【企业级】

鸣谢 本文有www.pusdn.com | PUSDN提供技术支持 数据库命名规范 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 禁止使用SELECT * 必须使用SELECT <…

如何压缩照片大小?快速解决照片文件过大的问题!

在当今数字化时代&#xff0c;照片已经成为我们生活中不可或缺的一部分。无论是记录美好时刻&#xff0c;分享精彩瞬间&#xff0c;还是用于工作需求&#xff0c;我们都会遇到一种常见的问题 - 照片文件大小过大。这种情况下&#xff0c;我们需要找到一种方法来缩小照片的文件大…

AE修剪路径怎么用?

AE修剪路径怎么用?直线怎样做伸展动画呢&#xff1f;今天就教大家如何操作。 如图&#xff0c;让画面上的直线做伸展动画。 点击左下角的“添加”。 点击“修剪路径”。 文章源自设计学徒自学网-https://www.sx1c.com/38146.html 进度条移动到最开始&#xff0c;再点击左边结…

浅析企业微电网能效系统建设——安科瑞赵嘉敏

一 案例介绍 随着新型电力系统进程加快&#xff0c;新能源装机占比逐步提高&#xff0c;发电侧波动性、随机性导致可靠容量降低。加之极端天气带动负荷快速增长&#xff0c;造成电力供需紧张、电网尖峰负荷屡创新高&#xff0c;对现有能源供应带来巨大挑战。 国家电投五凌电力…

5.【CPP】内存管理(text段data段bss段||nwedelete底层实现||源码)

一.内存管理 1.如图 2.heap下面的空间 应用程序加载到内存中由操作系统完成对bss,data,text,stack加载&#xff0c;并在内存分配空间。在编译阶段已经确定分配了多少空间&#xff0c;属于静态分配。 而malloc等在程序运行时在堆上开辟空间则属于动态分配&#xff0c;需要手动f…

一网打尽 this,对执行上下文说 Yes

文章目录 全局环境下的 this上下文对象调用中的 thisbind/call/apply 改变 this 指向构造函数和 this箭头函数中的 this 指向this 优先级相关实现一个bind 函数 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人…

解读加密生态的未来:通过用户钱包画像分析预测市场趋势

作者&#xff1a;stellafootprint.network 加密生态领域变化莫测&#xff0c;但深入分析区块链数据&#xff0c;我们可以发现未来走势的线索。如果通过用户钱包画像分析&#xff0c;能够提前捕捉到这些信号&#xff0c;投资者是否能够抢占先机&#xff0c;领先市场&#xff1f…

Linux常用命令之vim、cat、grep

vim:编辑文件内容 cat&#xff1a;查看文件内容 grep:用于查找文件里符合条件的字符串 grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文…

Virtual Box安装Kali Linux 虚拟机

一、Kali Linux —— 安装和配置 Kali Linux 是道德黑客最好的安全软件包之一&#xff0c;包含一组按类别划分的工具。它是一个开源的系统&#xff0c;其官方网页是https://www.kali.org。 一般来说&#xff0c;Kali Linux 可以作为操作系统安装在机器上。Kali Linux提供了更…

接口自动化神器 apin【 快速入门篇】

关于自动化测试&#xff0c;这些年经历了太多的坑&#xff0c;有被动的坑&#xff0c;也有自己主动挖的坑&#xff0c;在这里做了一些总结。 一、apin 介绍及安装 1、什么是 apin apin是一个无需写代码&#xff0c;就可以进行接口自动化测试的框架&#xff0c;只需要通过jso…