教你如何实现直播源代码的搜索功能

一、需求描述
直播源代码实现一个搜索框:
1、输入关键字,按键抬起后可以实现查询功能;
2、下拉列表展示搜索结果,搜索结果中关键字要用特殊颜色突出显示,默认选中搜索结果的第一项;
3、可以按上下键切换选中项,按回车输出选中项;
4、单击组件之外的地方可以收起下拉列表;

二、分析
直播源代码用到的插件 pinyin-match:
支持拼音全拼、简拼和汉字模糊匹配。
调用match方法,匹配成功返回数组([匹配到第一个字符的下标,匹配到最后一个字符的下标]),失败返回false。

三、代码实现

<template><div class="search-wrapper" @click.stop><div class="search-input" :class="{'is-focus':isFocus}"><!-- 搜索输入框 --><input type="text"autocomplete="off"autocorrect="off"autocapitalize="off"autofocusv-model="value"ref='searchInput'spellcheck="false"placeholder="搜索..."@click="changeInput"@keyup="clickSearch"@keydown.down.prevent="navigateOptions('next')"@keydown.up.prevent="navigateOptions('prev')"><!-- 搜索放大镜图标 --><div class="search-icons"><i class="el-icon-close" v-show="value" @click="clearSearchValue"></i>    <i class="el-icon-search" v-show="!value" @click="clickSearch"></i></div>      </div><!-- 搜索下拉列表 --><div class="search-list"><div class="search-result" ref="ul"><ul v-for="item in result">            <li class="select-li" :class="{'is-selected': item.isSelected}" @click="clickResultItem(item)"><img class="user-avatar" src="../../images/avatar.png"><div class="user-name"><span>{{item.keyword[0]}}<span class="keyword">{{item.keyword[1]}}</span>{{item.keyword[2]}}</span>                        </div></li></ul><!-- 查询结果为空时候 --><div class="result-null" v-if="value && result.length == 0">没有结果 </div>         </div></div></div>
</template>
<script>
const PinyinMatch = require('pinyin-match');
export default {name: 'SearchInput',data () {return {isFocus: false,//搜索框是否获取了焦点value: '',//输入的搜索关键字result : [],//全部搜索结果curIndex: 0,//选中的搜索结果的下标selectItem: {},//选中的搜索结果userList: [{name:'安其拉',id:'a1'},{name:'安琪',id:'a2'},{name:'陈仙仙', id:'c1' },{name:'成小龙', id:'c2' },{name:'程野', id:'c3' },{name:'丁小明', id:'d1' },{name:'丁小龙', id:'d2' },{name:'丁小野', id:'d3' },{name:'冯小明', id:'f1' },{name:'冯小龙', id:'f2' },{name:'冯小野', id:'f3' },{name:'高小明', id:'g1' },{name:'高小龙', id:'g2' },{name:'高小野', id:'g3' },{name:'高小阳', id:'g4' },{name:'郭小名', id:'g5' },{name:'黄小明', id:'h1' },{name:'黄小龙', id:'h2' },{name:'黄小野', id:'h3' },{name:'郝小阳', id:'h4' },{name:'郝小名', id:'h5' },{name:'李小明',id:'l1'},{name:'李小龙',id:'l2'},{name:'李小野',id:'l3'},{name:'李小阳',id:'l4'},{name:'李小一',id:'l5'},{name:'李小二',id:'l6'},{name:'李小三',id:'l7'},{name:'李小四',id:'l8'},{name:'李小五',id:'l9'},] }},mounted () {   let that = this;   document.body.addEventListener('click', () => {//单击组件之外时收起下拉列表that.isFocus = false;that.value = "";}, false);},methods: {changeInput() {//单击搜索框时获取焦点this.isFocus = true;  },clearSearchValue () {//清空输入的查询条件if (this.value) {this.value = "";//搜索关键字this.result = [];//全部搜索结果this.curIndex = 0;//选中的搜索结果的下标this.selectItem = {};//选中的搜索结果this.$refs.searchInput.focus();//输入查询条件清空后获取焦点}},clickSearch () {//查询if (event.code == "ArrowDown" || event.code == "ArrowUp") {//上下键return;}       if (event.code == "Enter" && this.selectItem) {this.clickResultItem(this.selectItem);//有搜索结果时按下enter直接选中第一项return;}this.result = [];//全部搜索结果this.curIndex = 0;//选中的搜索结果的下标this.selectItem = {};//选中的搜索结果if (this.value.trim()) {                                 for (let i = 0; i < this.userList.length; i++) {//根据所有人员名字匹配let name = this.userList[i].name;let search = PinyinMatch.match(name, this.value);          if (search && search.length > 0) {               this.userList[i].keyword = this.getKeyWord(name, search);this.userList[i].isSelected = false;            this.result.push(this.userList[i]);         }}if (this.result && this.result[0]) {this.result[0].isSelected = true;this.curIndex = 0;//选中的搜索结果的下标this.selectItem = this.result[0];//选中的搜索结果}       } else {this.$refs.searchInput.focus();//没有输入查询条件焦点不应该失去}},getKeyWord (name, search) {//关键字let keyword = [];keyword[0] = name.substring(0, search[0]);if (search[0] == search[1]) {keyword[1] = name.charAt(search[0]);//匹配到的作为关键字keyword[2] = name.substring(search[0] + 1);} else {keyword[1] = name.substring(search[0], search[1] + 1);//匹配到的作为关键字keyword[2] = name.substring(search[1] + 1);}return keyword;},             clickResultItem (data) {//单击下拉列表中的选项    alert('您选择了' + data.name);},navigateOptions (direction) { //搜索结果上下键选择let resultLength = this.result.length;if (resultLength == 0 || resultLength == 1 ) {return;}let lastIndex = this.curIndex;if (direction === 'next') {//向下      this.curIndex++;   if (this.curIndex === resultLength) {this.curIndex = 0;}       }if (direction === 'prev') {//向上this.curIndex--;if (this.curIndex < 0) {        this.curIndex = resultLength - 1;}}if (lastIndex < resultLength) {        this.result[lastIndex].isSelected = false;}if (-1 < this.curIndex < resultLength) {this.selectItem = this.result[this.curIndex];this.selectItem.isSelected = true;    // this.result[this.curIndex].isSelected = true; this.$set(this.result,this.curIndex,this.selectItem)     }this.resetScrollTop();},resetScrollTop () { //设置滚动条的位置let maxShowCount = this.$refs.ul.clientHeight / 50;let diff = this.curIndex - maxShowCount;       diff += 4;      this.$refs.ul.scrollTop = diff * (50) + 60;},}
}
</script>
<style src="./index.scss" lang="scss"></style>

index.scss

.search-wrapper {background-color: rgb(235, 148, 148);height: 580px;width:325px; overflow: hidden;border-radius: 3px;font-family: 'Microsoft YaHei';box-sizing: border-box;padding: 10px;.search-input{position: relative;input {width: 100%;height: 35px;box-sizing: border-box;border: 0;border-radius: 3px;margin: 0;padding: 0px 40px 0px 10px;outline: 0;font-size: 14px;color: #E5EAEE;// background-color: #209df7;background-color: #fff;}input::-webkit-input-placeholder {color: #E5EAEE;}.search-icons {position: absolute;top: 7px;right: 10px;color: #209df7;font-size: 17px;}}.is-focus {overflow: visible !important;input {color: #222 !important;// border: 1px solid #fff !important;// background-color: #fff !important;box-shadow: inset 0 1px 3px rgba(0, 0, 0, .2), 0 1px 15px hsla(0, 0%, 100%, .3) !important;}.search-icons {.el-icon-close{color: #111;background-color: #d8d8d8;border-radius: 50%;padding: 2px;box-sizing: border-box;font-size: 15px;cursor: pointer;}.el-icon-close:hover{color: #fff;background-color: #209df7;}}}.search-list{height: 480px;margin-top: 8px;border: 0 none;    border-radius: 3px;box-shadow: 0 0 6px rgba(0, 0, 0, .15);   background-color: #fff;    .search-result {height: 100%;overflow-x: hidden;overflow-y: auto;ul, li{margin: 0px;padding: 0px;}li{list-style-type: none;}.select-li {cursor: pointer;padding: 8px 10px;overflow: hidden;border-bottom: 1px solid #ebebeb;.user-avatar {border-radius: 50%;float: left;width: 40px;height: 40px;background-size: cover;}.user-name {width: 200px;float: left;margin-left: 15px;line-height: 40px;.keyword {color: #008cee;}} }.select-li:hover{background-color: #e5f0fa;}.is-selected {background-color: rgba(140, 197, 255, 0.46)}}.result-null {margin-top: 100px;text-align: center;font-size: 20px;}}
}::-webkit-scrollbar {width: 6px;height: 6px;
}
/*滑动轨道*/     
::-webkit-scrollbar-track-piece {background-color: transparent;-webkit-border-radius: 6px;
}  
// 下面是滑块
/*竖向滚动条*/      
::-webkit-scrollbar-thumb:vertical {height: 5px;background-color: rgb(161, 161, 161);-webkit-border-radius: 6px;
}
/*横向滚动条*/          
::-webkit-scrollbar-thumb:horizontal {width: 5px;background-color: rgb(143, 144, 145);-webkit-border-radius: 6px;
}

三、效果

在这里插入图片描述

以上直播源代码就实现了一个简单的搜索框。

下面对直播源代码的搜索过程进行简单的优化:

在data中添加 timer:null
将搜索过程放入 setTimeout 函数中,按键抬起半秒后再去进行搜索。

    clickSearch () {//查询if (event.code == "ArrowDown" || event.code == "ArrowUp") {//上下键return;}       if (event.code == "Enter" && this.selectItem) {this.clickResultItem(this.selectItem);//有搜索结果时按下enter直接选中第一项return;}this.result = [];//全部搜索结果this.curIndex = 0;//选中的搜索结果的下标this.selectItem = {};//选中的搜索结果if (this.value.trim()) {     clearTimeout(this.timer);this.timer = setTimeout(function () {for (let i = 0; i < this.userList.length; i++) {//根据所有人员名字匹配let name = this.userList[i].name;let search = PinyinMatch.match(name, this.value);          if (search && search.length > 0) {               this.userList[i].keyword = this.getKeyWord(name, search);this.userList[i].isSelected = false;            this.result.push(this.userList[i]);         }}if (this.result && this.result[0]) {this.result[0].isSelected = true;this.curIndex = 0;//选中的搜索结果的下标this.selectItem = this.result[0];//选中的搜索结果}         }, 500)                                        } else {this.$refs.searchInput.focus();//没有输入查询条件焦点不应该失去}},

本文由云豹科技转发自五花漏博客,如有侵权请联系作者删除

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

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

相关文章

虚拟号码认证如何开通?

近年来&#xff0c;经常会接到外卖、房产中介、信用贷款等电话&#xff0c;让顾客不胜其扰。现在电话标记功能使用越来越普遍&#xff0c;可以大概了解电话“来意”&#xff0c;同时也会让误标记、恶意标记很方便。对于开展业务或办公司或企业的人&#xff0c;更加不能让自己的…

1分钟自动产出高质量PPT:ChatGPT + MidShow

你可能想知道如何在一分钟内自动产出高质量的PPT。有了ChatGPT和MindShow&#xff0c;这不再是一个难题。ChatGPT是一个基于OpenAI的强大的自然语言生成模型&#xff0c;它可以根据你的输入生成各种类型的文本&#xff0c;包括PPT提纲。MindShow是一个在线的PPT制作工具&#x…

PPT内置宏教程——放映时用控件切换动态图表

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 由于PPT中有多张类似但不太重要的图表&#xff0c;实际汇报时只挑重点说明&#xff0c;其他的基本略过。因此有必要用可选的方式将这…

客观评价华为的OS鸿蒙系统

论华为的OS鸿蒙系统 现在毫无疑问的是排名靠前的手机厂商都想有自己的操作系统 现在任何一家手机厂商都没有制作出属于自己的操作系统&#xff08;苹果除外&#xff09;&#xff0c;安卓阵营的任何一家公开市场的手机厂商他们都只造出了身体&#xff0c;核心的系统并没有造出&…

华为鸿蒙系统界面亮相,比Android操作更简单。

现在手机已经很普及了&#xff0c;手机系统主要有两大系统&#xff0c;一个是Android系统&#xff0c;一个是ios系统&#xff0c;但是华为让所有人看到了第三个系统&#xff0c;那就是鸿蒙系统。前不久谷歌宣布不与华为中断合作&#xff0c;那么华为接下来再想推出新手机&#…

重磅,鸿蒙系统底层彻底开源OpenHarmony!

程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 5 分钟。 OpenHarmony是由开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目&#xff0c;目标是面向全场景、全连接、全智能时代&#xff0c;基于开源的方式&#xff…

华为 鸿蒙 操作系统关键特性解读

关注、星标公众号&#xff0c;直达精彩内容 1、计算机为什么需要操作系统&#xff1f; 大部分人认为&#xff0c;操作系统本来就是与计算机&#xff08;IT设备&#xff09;一体的。究竟计算机为什么需要操作系统&#xff1f;可能我们并不会去特意想这个问题。 其实&#xff0c;…

HarmonyOS、鸿蒙系统初探、概述

概述 系统定位和技术架构技术特性分布式软总线分布式设备虚拟化分布式数据管理分布式任务调度一次开发&#xff0c;多端部署统一OS&#xff0c;弹性部署 系统安全正确的人正确的设备正确地使用数据 系统定位和技术架构 HarmonyOS是一款“面向未来”、面向全场景&#xff08;移动…

适合开发人员看的鸿蒙OS介绍~

“ 本文面向的是开发人员&#xff0c;主要想通过科普让大家了解一下鸿蒙开发。 到底什么是鸿蒙 OS 在官网上看到鸿蒙 OS 的简介是&#xff0c;分布式能力造就新硬件、新交互、新服务&#xff0c;打开焕然一新的全场景世界。以及发布会提及最多是他的万物互连&#xff0c;全场景…

鸿蒙系统深入课程1--鸿蒙相比Android的特点及战略(全网最明白的)

课程答疑和新课信息&#xff1a;QQ交流群&#xff1a;422901085进行课程讨论&#xff0c;加群主qq享受 优惠 FrameWork入门课视频链接&#xff1a;https://edu.csdn.net/course/detail/30298 FrameWork实战课1视频链接&#xff1a;https://edu.csdn.net/course/detail/30275 Fr…

鸿蒙之外,腾讯联手中兴发展开源操作系统,与谷歌安卓抗衡

腾讯发展的国产操作系统又有了新盟友&#xff0c;继酷派之后&#xff0c;中兴携它的新支点操作系统加入了腾讯推动的开源操作系统社区OpenCloudOS&#xff0c;这意味着腾讯开始与实力更强的中兴联手推动国产操作系统的发展。 腾讯推动的开源操作系统社区OpenCloudOS此前已有浪潮…

初识鸿蒙OS,你好,HarmonyOS!

为什么会有鸿蒙&#xff0c;出现鸿蒙的意义又是什么呢&#xff1f; 谈到为什么会有HarmonyOS鸿蒙系统&#xff0c;那我们就不得不说说&#xff0c;我们的移动通信技术的发展&#xff0c;现今我们大多数人都使用上5G网络了&#xff0c;回想一下从最初的1G网络到3G再到4G网络&…

谷歌对于鸿蒙的看法,谷歌评价华为鸿蒙系统,被华为鸿蒙系统震惊了

据新闻媒体指谷歌在开发人员交流会上公布了安卓12&#xff0c;发布的合作方名册中沒有华为&#xff0c;安卓12不会再兼容华为手机上&#xff0c;这代表着谷歌和华为已宣布破裂&#xff0c;华为务必让自身鸿蒙系统上线。 很多年前华为就声称自身已经产品研发手机操作系统&#x…

技巧分享:视频配音怎么制作?(内附3种配音教程)

随着科技的发展&#xff0c;越来越多新颖的娱乐项目出现在我们的眼前。而要说现在受人喜欢的一些娱乐项目&#xff0c;那不能不提短视频了。可以说&#xff0c;大部分小伙伴都会接触短视频&#xff0c;例如刷短视频、制作短视频、发布短视频等等。 现在很多小伙伴都喜欢自己制…

视频配音篇,如何使用百度翻译将文本转换为mp3语音?

打开百度翻译 百度翻译&#xff1a;https://fanyi.baidu.com/ 打开开发者工具 点击浏览器右上角按钮&#xff0c;选择更多工具&#xff0c;开发者工具 这里推荐使用Chrome浏览器&#xff0c;当然新版Edge也更换了Chrome内核&#xff0c;操作方式基本相同&#xff1b; 复制需要转…

新手如何选择 视频配音软件(文字转语音)

目录 1.先说结论&#xff1a;完全免费的 剪映配音 可以满足大部分需求 2.五款流行的配音软件优缺点 3.为什么剪映会免费 4.剪映配音&#xff1a;极简教程 4.1 下载、安装剪映&#xff1a; 4.2 新建项目&#xff0c;导入素材 4.3 添加文本 4.4 文本转语音 4.5 导出语音…

什么软件能在线支持视频配音文字转语音?

怎么自己给视频配音&#xff1f;这个问题相信很多小伙伴都有这种烦恼&#xff01;特别是接触短视频制作的小伙伴应该都知道&#xff0c;想制作一个比较能吸引人的视频vlog&#xff0c;不仅要单靠视频剪辑&#xff0c;还要学会.一帜。那你们知道怎么自己给视频配音&#xff1f;接…

利用CamtasiaStudio软件为英语视频自动添加英文字幕

一、背景说明 Camtasia Studio是美国TechSmith公司出品的屏幕录像和编辑的软件套装。软件提供了强大的屏幕录像(Camtasia Recorder)、视频的剪辑和编辑(Camtasi Studio)、视频菜单制作(Camtasia MenuMaker)、视频剧场(Camtasi Theater)和视频播放功能(Camtasia Playe…

OpenAI Whisper + FFmpeg + TTS:动态实现跨语言视频音频翻译

本文作者系360奇舞团前端开发工程师 摘要&#xff1a; 本文介绍了如何结合 OpenAI Whisper、FFmpeg 和 TTS&#xff08;Text-to-Speech&#xff09;技术&#xff0c;以实现将视频翻译为其他语言并更换声音的过程。我们将探讨如何使用 OpenAI Whisper 进行语音识别和翻译&#x…

有哪些翻译视频声音的软件?1分钟教会你视频翻译的技巧

平常喜欢追美剧或韩剧的小伙伴们&#xff0c;是不是会因为没有中文字幕而烦恼呢&#xff0c;其实我们可以借助一些软件将视频内容翻译成中文或其他熟悉的语言&#xff0c;这样也能提高我们的效率。那么&#xff0c;你知道视频翻译软件哪个好吗&#xff1f;今天安利三个日常必备…