【sgAutocomplete】自定义组件:基于elementUI的el-autocomplete组件开发的自动补全下拉框组件(带输入建议的自动补全输入框)

d4f50ad8f5e54f549e447d0a0a6c694f.gif

特性:

1、支持本地保存选中过的记录

2、支持动态接口获取匹配下拉框内容

3、可以指定对应的显示label和字段组件key

4、自动生成速记符字段(包含声母和全拼两种类型),增强搜索匹配效率

sgAutocomplete源码

<template><!-- 基于elementUIel-autocomplete组件开发的自动补全下拉框组件 --><el-autocomplete:class="$options.name"style="width: 100%"ref="autocomplete":popper-class="'sgAutocomplete-el-autocomplete'"v-model="inputSearchValue":placeholder="placeholder || `输入关键词…`":value-key="valueKey || `label`":fetch-suggestions="fetchSuggestions":hide-loading="false"@focus="$refs.autocomplete.$el.querySelector('input').select()"@select="selectSuggestionsItem"@clear="focusAutocomplete":debounce="0"clearable><template slot-scope="{ item }"><div><i v-if="item.isHistory" class="history-icon el-icon-time" /><span class="label">{{ item[labelKey || `label`] }}</span></div></template><!-- 搜索按钮1 --><i class="el-icon-search el-input__icon" slot="suffix" v-if="showSearchButton == 1" /><!-- 删除历史记录按钮 --><i:title="clearHistoryTitle || `删除历史记录`"class="el-icon-delete el-input__icon clearHistory"slot="suffix"v-if="showHistoryBtn"@click="clearHistory"/><!-- 搜索按钮2 --><el-buttonslot="append"icon="el-icon-search"@click="focusAutocomplete"v-if="showSearchButton == 2"></el-button></el-autocomplete>
</template><script>
import pinyin from "@/js/pinyin";
export default {name: "sgAutocomplete",components: {},data() {return {inputSearchValue: null,historyListLocalStorageName: null, //保存到本地记录的localStorage KeysearchItems: [],showHistoryBtn: false,};},props: ["data", //可选项数组(必选参数)"value","valueKey", //获取值"labelKey", //显示值"placeholder","clearHistoryTitle", //删除历史记录按钮提示"filterKeys", //匹配搜索的字段(数组)不传此参数默认就用labelKey"showHistory", //显示历史选择记录"showSearchButton", //显示搜索按钮(样式:1 是在输入框里面的icon,2 是在输入框后面的按钮)"autofocus",],watch: {data: {handler(newValue, oldValue) {if (newValue && Object.keys(newValue).length) {this.searchItems = JSON.parse(JSON.stringify(newValue));this.searchItems.forEach((v) => {v.SJF = pinyin.getCamelChars(v[this.labelKey || "label"]); //速记符(声母)v.SJF_full = pinyin.getFullChars(v[this.labelKey || "label"]); //速记符(全拼)});}},deep: true, //深度监听immediate: true, //立即执行},value: {handler(newValue, oldValue) {this.inputSearchValue = newValue;},deep: true, //深度监听immediate: true, //立即执行},inputSearchValue: {handler(newValue, oldValue) {this.$emit(`input`, newValue);},deep: true, //深度监听immediate: true, //立即执行},showHistory: {handler(newValue, oldValue) {this.historyListLocalStorageName = newValue;},deep: true, //深度监听immediate: true, //立即执行},},mounted() {(this.autofocus === "" || this.autofocus) && this.focusAutocomplete(); //默认聚焦},methods: {focusAutocomplete(d) {this.$nextTick(() => {this.$refs.autocomplete.focus();this.$refs.autocomplete.activated = true; //这句话是重点});},// 搜索下拉框fetchSuggestions(queryString, callback) {if (queryString) {queryString = queryString.toString().trim();let r = this.searchItems.filter((v, i, ar) => {let filterKeys = this.filterKeys || [this.labelKey];filterKeys.push("SJF", "SJF_full"); //自动匹配声母、全屏组合return filterKeys.some((filterKey) =>v[filterKey].toLocaleLowerCase().includes(queryString.toLocaleLowerCase()));});this.showHistoryBtn = false;callback(r);} else {let historys = this.getHistorys();historys.forEach((v) => (v.isHistory = true)); //标识是历史记录this.showHistoryBtn = historys.length > 0;callback(historys);}},selectSuggestionsItem(d) {let historys = this.getHistorys();if (historys.length) {let k = this.valueKey || this.labelKey || "label";let has = historys.some((v) => v[k] == d[k]);has || historys.unshift(d);localStorage[this.historyListLocalStorageName] = JSON.stringify(historys);} else {localStorage[this.historyListLocalStorageName] = JSON.stringify([d]);}this.$emit(`change`, d);},getHistorys() {let historys = localStorage[this.historyListLocalStorageName];return JSON.parse(historys || "[]");},clearHistory(d) {delete localStorage[this.historyListLocalStorageName];this.showHistoryBtn = false;this.focusAutocomplete();},},
};
</script><style lang="scss" scoped>
.sgAutocomplete {.clearHistory {cursor: pointer;&:hover {color: #409eff;}}
}
</style>

里面用到的pinyin.js在这篇文章里面JS自动生成速记符、拼音简写/拼音的声母(例如:“你挚爱的强哥”转换为“NZADQG”)。提取首字母,返回大写形式;提取拼音, 返回首字母大写形式(全拼)。_你挚爱的强哥的博客-CSDN博客文章浏览阅读2.7k次。需要引用以下pinyin.js文件。https://blog.csdn.net/qq_37860634/article/details/130765296

用例

<template><div><sgAutocompleteautofocusv-model="sgAutocompleteValue":data="data":placeholder="`输入搜索关键词...`":valueKey="`value`":labelKey="`label`"showHistory="localStorageHistoryName"showSearchButton="2"@change="changeSgAutocomplete"/><p style="margin-top: 20px">选择的数据:{{ sgAutocompleteValue }}</p><pstyle="margin-top: 20px;word-wrap: break-word;word-break: break-all;white-space: break-spaces;"><span>选择的对象:</span>{{ sgAutocompleteObject ? JSON.stringify(sgAutocompleteObject, null, 2) : "" }}</p></div>
</template>
<script>
import sgAutocomplete from "@/vue/components/admin/sgAutocomplete";
export default {components: { sgAutocomplete },data() {return {sgAutocompleteValue: null,sgAutocompleteObject: null,data: [],//模拟数据1dataA: [{ value: "1", label: "A显示文本1" },{ value: "2", label: "A显示文本2" },{ value: "3", label: "A显示文本3" },{ value: "4", label: "A显示文本4" },{ value: "5", label: "A显示文本5" },],//模拟数据2dataB: [{ value: "1", label: "B显示文本1" },{ value: "2", label: "B显示文本2" },{ value: "3", label: "B显示文本3" },{ value: "4", label: "B显示文本4" },{ value: "5", label: "B显示文本5" },],};},watch: {// 模拟动态更新筛选项sgAutocompleteValue: {handler(newValue, oldValue) {if (newValue && Object.keys(newValue).length) {switch (newValue.toLocaleLowerCase()) {case "a":this.data = this.dataA;break;case "b":this.data = this.dataB;break;}}},},},methods: {changeSgAutocomplete(d) {this.sgAutocompleteObject = d;},},
};
</script>

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对于初学者来说,从哪些方面开始学习 Java 编程比较好?

对于初学者来说&#xff0c;从哪些方面开始学习 Java 编程比较好&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「Java的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全…

电脑待机怎么设置?让你的电脑更加节能

在日常使用电脑的过程中&#xff0c;合理设置待机模式是一项省电且环保的好习惯。然而&#xff0c;许多用户对于如何设置电脑待机感到困扰。那么电脑待机怎么设置呢&#xff1f;本文将深入探讨三种常用的电脑待机设置方法&#xff0c;通过详细的步骤&#xff0c;帮助用户更好地…

Windows 和 MacOS 上安装配置ADB(安卓调试桥)

一、Android 调试桥 (ADB) Android 调试桥&#xff08;ADB&#xff09; 是一款多功能命令行工具&#xff0c;它让你能够更便捷地访问和管理 Android 设备。使用 ADB 命令&#xff0c;你可以轻松执行以下操作 在设备上安装、复制和删除文件&#xff1b;安装应用程序&#xff1…

.NET 反射优化的经验分享

比如针对 GetCustomAttributes 通过反射获取属性的优化,以下例子 // dotnet run -c Release -f net7.0 --filter "*" --runtimes net7.0 net8.0public class Tests{public object[] GetCustomAttributes() => typeof(C).GetCustomAttributes(typeof(MyAttribute…

代码随想录第三十一天(一刷C语言)|无重叠区间划分字母区间合并区间

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、无重叠区间 思路&#xff1a;参考carl文档 按照右边界排序&#xff0c;从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了。 ledcode题目&a…

【智能家居】智能家居项目

智能家居项目目录 项目目录结构 完整而典型的项目目录结构 CMake模板 CMake编译运行 README.md 项目说明文档 智能家居项目目录 【智能家居】面向对象编程OOP和设计模式(工厂模式) 【智能家居】一、工厂模式实现继电器灯控制 【智能家居】二、添加火灾检测模块&#xff08;…

6.3 C++11 原子操作与原子类型

一、原子类型 1.多线程下的问题 在C中&#xff0c;一个全局数据在多个线程中被同时使用时&#xff0c;如果不加任何处理&#xff0c;则会出现数据同步的问题。 #include <iostream> #include <thread> #include <chrono> long val 0;void test() {for (i…

深度学习中的13种概率分布

1 概率分布概述 共轭意味着它有共轭分布的关系。 在贝叶斯概率论中&#xff0c;如果后验分布 p&#xff08;θx&#xff09;与先验概率分布 p&#xff08;θ&#xff09;在同一概率分布族中&#xff0c;则先验和后验称为共轭分布&#xff0c;先验称为似然函数的共轭先验。 多…

nodejs使用express框架启动服务操作mysql数据库

描述: 首先在本地搭建mysql数据库,配置:host: ‘192.168.3.249’,user: ‘mkx’,password: ‘123456’,database: ‘gg’.测试连接正常.使用express写两个接口, 1.查询所有学生的接口,使用的get请求,无参数. 2.插入一条学生信息,使用post请求,body是一个json的学生信息{name:“…

Java基础课的中下基础课04

目录 二十三、集合相关 23.1 集合 &#xff08;1&#xff09;集合的分支 23.2 List有序可重复集合 &#xff08;1&#xff09;ArrayList类 &#xff08;2&#xff09;泛型 &#xff08;3&#xff09;ArrayList常用方法 &#xff08;4&#xff09;Vector类 &#xff08;…

【产品】Axure的基本使用(二)

文章目录 一、元件基本介绍1.1 概述1.2 元件操作1.3 热区的使用 二、表单型元件的使用2.1 文本框2.2 文本域2.3 下拉列表2.4 列表框2.5 单选按钮2.6 复选框2.7 菜单与表格元件的使用 三、实例3.1 登录2.2 个人简历 一、元件基本介绍 1.1 概述 在Axure RP中&#xff0c;元件是…

Java网络编程-深入理解BIO、NIO

深入理解BIO与NIO BIO BIO 为 Blocked-IO&#xff08;阻塞 IO&#xff09;&#xff0c;在 JDK1.4 之前建立网络连接时&#xff0c;只能使用 BIO 使用 BIO 时&#xff0c;服务端会对客户端的每个请求都建立一个线程进行处理&#xff0c;客户端向服务端发送请求后&#xff0c;…

用print太慢了!强烈推荐这款Python Debug工具~

作为程序员&#xff0c;我们都深知调试&#xff08;Debug&#xff09;在编程过程中的重要性。然而&#xff0c;使用传统的"print"语句进行调试可能效率较低&#xff0c;今天&#xff0c;笔者将推荐一款独具一格的Python调试工具——Reloadium。Reloadium为IDE添加了热…

SU渲染受到电脑性能影响大吗?如何提高渲染速度

一般3d设计师们在进行设计工作前都需要提供一台高配电脑&#xff0c;那么你这知道su渲染对电脑要求高吗&#xff1f;电脑带不动su怎么解决&#xff1f;su对电脑什么配件要求高&#xff1f;今天这篇文章就详细为大家带来电脑硬件对su建模渲染的影响&#xff0c;以及su渲染慢怎么…

基于YOLOv8深度学习的西红柿成熟度检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【docker】镜像使用(Nginx 示例)

查看本地镜像列表 docker images删除本地镜像 # docker rmi [容器 ID]docker rmi a6bd71f48f68 查找镜像 docker search nginx 参数介绍 NAME: 镜像仓库源的名称DESCRIPTION: 镜像的描述OFFICIAL: 是否 docker 官方发布STARS: 点赞、喜欢AUTOMATED: 自动构建。 拉去镜像 …

Ubuntu宝塔面板本地部署Emlog个人博客网站并远程访问【内网穿透】

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

Centos7防火墙及端口开启

1、防火墙 1.1、查看防火墙是否开启 systemctl status firewalld 1.2、开启防火墙 firewall-cmd --list-ports 1.3、重启防火墙 firewall-cmd --reload 2、端口 2.1、查看所有已开启的端口号 firewall-cmd --list-ports 2.2、手动开启端口 启动防火墙后&#xff0c;默认没有开…

保姆级 | XSS Platform环境搭建

0x00 前言 XSS Platform 平台主要是用作验证跨站脚本攻击。该平台可以部署在本地或服务器环境中。我们可以使用 XSS Platfrom 平台搭建、学习或验证各种类型的 XSS 漏洞。 0x01 环境说明 HECS(云耀云服务器)xss platformUbuntu 22.04Nginx 1.24.0MySQL 5.6.51Pure-Ftpd 1.0.49…

Java实现机考程序界面

机考界面如下&#xff08;单选题&#xff09;&#xff0c;上方是题目状态&#xff0c;下方是题目&#xff0c;1/5/1是已做题目数量、总共题目数量和答对题目数量。 再看一下多选题的界面。 判断题的界面。 回答正确时的反馈&#xff0c;会给出用时。 回答错误时的反馈&#xff…