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

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>

点个赞呗~

相关文章:

  • MySQL、Oracle 常用SQL:建表、建视图、数据增删改查、常用condition
  • WPF Converter转换器
  • 如何将github copilot当gpt4用
  • 8. 《自动驾驶与机器人中的SLAM技术》基于保存的自定义NDT地图文件进行自动驾驶车辆的激光定位
  • 如何进行产品的人机交互设计?
  • 十、Qt 操作PDF文件
  • 文心一言 vs. ChatGPT:哪个更胜一筹?
  • 整合junit与热部署
  • C技能树-学习笔记(1-2)C语言概述和数据类型
  • 2024年第十届控制、自动化与机器人国际会议(ICCAR 2024)即将召开!
  • 三种引入CSS的方式
  • 1 python计算机基础
  • 数据结构-第一章
  • androidkiller的两种异常情况
  • What is `@Controller` does?
  • 【译】理解JavaScript:new 关键字
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • flutter的key在widget list的作用以及必要性
  • Java的Interrupt与线程中断
  • JS专题之继承
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 记一次和乔布斯合作最难忘的经历
  • 排序算法之--选择排序
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端技术周刊 2019-02-11 Serverless
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​马来语翻译中文去哪比较好?
  • (27)4.8 习题课
  • (C#)获取字符编码的类
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十)T检验-第一部分
  • (五)MySQL的备份及恢复
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)socket Aio demo
  • (转)关于pipe()的详细解析
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .Net7 环境安装配置
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • @Data注解的作用
  • [ 数据结构 - C++] AVL树原理及实现
  • [2023-年度总结]凡是过往,皆为序章
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [AIGC] 开源流程引擎哪个好,如何选型?
  • [android] 请求码和结果码的作用
  • [Angular] 笔记 6:ngStyle
  • [C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改
  • [CSS]CSS 的背景
  • [C语言]——分支和循环(4)
  • [HTML]Web前端开发技术12(HTML5、CSS3、JavaScript )——喵喵画网页