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

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>

点个赞呗~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安科瑞应急疏散照明系统在歌舞娱乐等场所的应用

首先必须明确疏散照明并不包含疏散指示标志&#xff0c;疏散照明是为了提供人员疏散时的必要照明&#xff0c;必须达到规定照度&#xff0c;以便逃生时看清逃生的路径&#xff0c;避免出现恐慌及踩踏事故&#xff0c;而疏散指示标志则是提供疏散路径方向引导的&#xff0c;所以…

Python——基本语法(一)

一、程序和⽤户交互 python 中 使⽤ input 函数实现 input("这⾥写提示信息&#xff0c; 必须使⽤引号引起来")二、变量 In [1]: n input("输入数字") 输入数字8In [2]: n Out[2]: 81.变量命名潜规则: 不要以单下划线和双下划线开头&#xff1b;如&…

从零开始的 dbt 入门教程 (dbt core 命令进阶篇)

引 根据第一篇文章的约定&#xff0c;我想通过接下来的几篇文章带大家进一步了解 dbt 的用法&#xff0c;原计划这篇文章我会介绍 dbt 命令的进阶用法&#xff0c;进一步认识 dbt 的配置以及如何创建增量表等等零零散散十几个方面的知识点&#xff0c;结果在我写完命令部分发现…

CMake TcpServer项目 链接静态库/动态库

一、链接静态库 查看项目结构 hehedalinux:~/Linux/LinuxServerCpp-Link$ tree . ├── CMakeLists.txt ├── include │ ├── common │ │ ├── Buffer.h │ │ ├── Channel.h │ │ └── Log.h │ ├── http │ │ ├── HttpRequest…

Android Studio 项目结构

manifests&#xff1a;用于存放安卓程序的配置文件 AndroidManifest.xml&#xff1a;这是Android应用程序的清单文件&#xff0c;包含了应用程序的基本信息和组件声明等java&#xff1a;Java源代码文件存放的根目录 主代码 com.example.app&#xff1a;应用程序的主包名&#x…

nginx重定向,根据端口重定向

//直接跳转 if ($server_port 9058 ) {# return 301 https://$host$request_uri;return 301 http://www.baidu.com; }//重定向&#xff0c;不跳转域名&#xff0c;还是原域名 location / {if ($server_port 9058 ) {proxy_pass http://ts.***.***.com:9059;} }$args:GET请求…

世微AP5160宽电压 LED 降压型恒流芯片14-18V 3A 电源PCB线路

这是一款14-18V 3A 电流的PCB设计方案. 运用的是世微AP5160 电源驱动IC,这是一款效率高&#xff0c;稳定可靠的 LED 灯恒流驱动控制芯片&#xff0c;内置高精度比较器&#xff0c;固定 关断时间控制电路&#xff0c;恒流驱动电路等&#xff0c;特别适合大功率 LED 恒流驱动。 …

import { ArrowRight } from “@element-plus/icons-vue“;

今天下午快被这个问题折磨疯了 虽然知道这个问题怎么产生的 但项目里那个碍眼的红线就是去不掉 后来才发现 这是插件的锅 我的心情 你知道我想要说什么的 想必能看到这篇文章的 也知道这个问题是怎么产生的 vue3ts使用的时候 默认是需要带上文件名的 但是引入el组件时 …

yum仓库及NFS共享

目录 一.yum仓库的基本原理 1.Yum概述&#xff1a; 2.Yum实现过程&#xff1a; 二. yum配置文件及命令&#xff1a; 1. 主配置文件&#xff1a; 2. 仓库设置文件&#xff1a; 3 .日志文件&#xff1a; ​编辑4.yum命令详解&#xff1a; 三. 搭建仓库的方式&#xff1a; …

transbigdata笔记:清理研究区域内的轨迹漂移

1 方法介绍 transbigdata 考虑了三种轨迹漂移&#xff0c;需要被清理 速度阈值&#xff1a;如果当前轨迹数据点与之前&#xff08;和后续&#xff09;轨迹数据点之间的速度超过阈值&#xff0c;则视为漂移。 距离阈值&#xff1a;如果当前轨迹数据点与上一个&#xff08;和后…

Python网络爬虫进阶:自动切换HTTP代理IP的应用

前言 当你决定做一个网络爬虫的时候&#xff0c;就意味着你要面对一个很大的挑战——IP池和中间件。这两个东西听起来很大上&#xff0c;但其实就是为了让你的爬虫不被封杀了。下面我就来给你讲讲如何搞定这些东西。 第一步&#xff1a;创建爬虫IP池的详细过程 首先&#xf…

街机模拟游戏逆向工程(HACKROM)教程:[4]MAME的作弊功能

需要对游戏进行逆向分析&#xff0c;我们首先需要了解游戏的内存系统。在一个游戏的运行过程中&#xff0c;游戏中所有的变动&#xff0c;比如玩家的血量&#xff0c;敌人的血量&#xff0c;玩家所在位置&#xff0c;场景的位置&#xff0c;剩余时间&#xff0c;等等一切&#…

【部署LLaMa到自己的Linux服务器】

部署LLaMa到自己的Linux服务器 1、Llama2 项目获取方法1&#xff1a;有git可以直接克隆到本地方法2&#xff1a;直接下载 2、LLama2 项目部署3、申请Llama2许可4、下载模型权重5、运行 1、Llama2 项目获取 方法1&#xff1a;有git可以直接克隆到本地 创建一个空文件夹然后鼠标…

Pandas加载大数据集

Scaling to large datasets — pandas 2.1.4 documentationhttps://pandas.pydata.org/docs/user_guide/scale.html#use-efficient-datatypes官方文档提供了4种方法&#xff1a;只加载需要的列、转化数据类型、使用chunking&#xff08;转化文件存储格式&#xff09;、使用Dask…

使用OAK-D双目深度相机为turtlebot3小型移动机器人添加视觉系统

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是Ash…

Postman中文文档——安装与更新

前言 postman好不好用&#xff0c;只有自己去用过了才知道&#xff0c;如果你之前没有使用过的&#xff0c;那我建议尝试去安装使用一下。 postman是一款支持http协议的接口调试与测试工具&#xff0c;其主要特点就是功能强大&#xff0c;使用简单且易用性好 。 无论是开发人…

Istio 实战:WasmPlugin(Proxy-Wasm 插件)功能拓展

功能一&#xff1a;添加 header&#xff08;在代码里写死的 header&#xff0c;不做修改&#xff09; 代码分析 主要是通过 proxywasm 库提供的 AddHttpRequestHeader 和 AddHttpResponseHeader 添加 header&#xff0c;同理可以实现 header 的删除和修改 部署生效 tinygo …

【控制篇 / 分流】(7.4) ❀ 02. 对不同运营商IP网段访问进行分流 ❀ FortiGate 防火墙

【简介】公司有两条宽带用来上网&#xff0c;一条电信&#xff0c;一条联通&#xff0c;访问常用的某些网站速度时快时慢。领导要求&#xff0c;根据上网流量的目标运营商IP归属&#xff0c;将流量送到相应的运营商出口去&#xff0c;避免跨运营商上网。那么应该怎么做&#xf…

vivado 使用IP Integrator源

使用IP Integrator源 在Vivado Design Suite中&#xff0c;您可以在RTL中添加和管理IP子系统块设计&#xff08;.bd&#xff09;项目或设计。使用Vivado IP集成程序&#xff0c;您可以创建IP子系统块设计。IP集成程序使您能够通过实例化和将Vivado IP目录中的多个IP核互连。可…

【PostgreSQL内核学习(二十一)—— 执行器(InitPlan)】

执行器&#xff08;InitPlan&#xff09; 概述InitPlan 函数代码段解释ExecInitNode 函数 总结 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵循合理使用原则&#xff0c;并在适用的情况下注明…