前端模糊搜索关键字高亮

效果

original-original

代码

<template>
	<view class="flexStart new-box">
		<view class="company">
			<!-- 输入框样式 -->
			<view class="spaceBetween companyName" @click.stop="isCompany = true">
				<input type="text"
					:style="result.userName.length > 0 ? 'padding-right: 90rpx !important;' : 'padding-right: 0rpx !important;'"
					@input="companyInput" v-model="result.userName" placeholder="请输入文本内容" placeholder-class="placeholderClass" />
				<!-- 清除按钮,使用的是icon,直接拷代码会失效 -->
				<view v-if="result.userName != ''" @click.stop="clearCompany" class="close center">
					<text class="iconfont icon-icon-qingchu"></text>
				</view>
			</view>
			<!-- 列表循环 -->
			<scroll-view v-if="isCompany" scroll-y="true" class="companyPrick">
				<view v-for="(item,index) in filterMsg" :key="index" @click="prickCompany(item)"
					class="companyPrick-item">
					<!-- 每一行的字做拆分,匹配合格的返回 true 高亮 -->
					<span :class="dealStr(str) ? 'hightLight' : ''" v-for="(str,strIndex) in item.name"
						:key="strIndex">{{str}}</span>
				</view>
			</scroll-view>
			<!-- 三角形样式 -->
			<view v-if="isCompany" class="triangle"></view>
		</view>
	</view>
</template>

<script setup lang="ts">
	import { ref } from 'vue';
	import { onLoad } from '@dcloudio/uni-app';

	const isCompany = ref(false) // 是否显示下拉框
	const result = ref({ // 提交的数据
		"userName": "",
		"userId": 0,
	})

	const companyList = ref([ // 接口获取数据
		{
			"id": 284,
			"name": "测试智能公司",
		},
		{
			"id": 286,
			"name": "北京文娱有限公司",
		},
		{
			"id": 289,
			"name": "广州市天河快递有限公司",
		},
		{
			"id": 290,
			"name": "广东天河电子科技有限公司",
		},
		{
			"id": 291,
			"name": "广州市天河汽车维修服务有限公司",
		},
		{
			"id": 293,
			"name": "智能化工厂",
		},
		{
			"id": 294,
			"name": "广州天河物联智能科技有限公司",
		},
		{
			"id": 295,
			"name": "测试工程开发",
		},
		{
			"id": 300,
			"name": "广东立智科技",
		},
		{
			"id": 302,
			"name": "广州番禺云服务科技",
		}
	])
	const filterMsg = ref([]) // 实际展现数据

	// 对输入内容处理判断是否符合条件
	function companyInput() {
        // result.value.userName 输入的内容
		let queryStringArr = result.value.userName.split("");
		let str = "(.*?)";
		filterMsg.value = [];
		let regStr = str + queryStringArr.join(str) + str;
		let reg = RegExp(regStr, "i"); // 以mh为例生成的正则表达式为/(.*?)m(.*?)h(.*?)/i
		companyList.value.map(item => {
			if (reg.test(item.name)) {
				filterMsg.value.push(item);
			}
		});
		// 输入为空时显示全部数据
		if (result.value.userName == '') {
			filterMsg.value = companyList.value
		}
	}
	
	// 字体高亮设置
	function dealStr(str : string) {
		let status = false
		for (let i = 0; i < result.value.userName.length; i++) {
			if (result.value.userName[i] == str) {
				status = true
			}
		}
		return status
	}

	// 点击选择单位
	function prickCompany(item : any) {
		result.value.userId = item.id as number
		result.value.userName = item.name
		isCompany.value = false
		companyInput()
	}

	// 清除输入框
	function clearCompany() {
		result.value.userId = 0
		result.value.userName = ""
		filterMsg.value = companyList.value
	}

	// 获取的数据给实际处理列表赋值,在接口处处理即可
	onLoad(() => {
		filterMsg.value = companyList.value
	})
</script>

<style lang="scss">
	.new-box {
		width: 100vw;
		height: 100vh;
		flex-flow: column;
	}

	.flexStart {
		display: flex;
		justify-content: flex-start;
		align-items: center;
	}

	.spaceBetween {
		display: flex;
		justify-content: space-between;
		align-items: center;
	}

	.center {
		display: flex;
		justify-content: center;
		align-items: center;
	}


	.company {
		margin-top: 20vh;
		border-radius: 20rpx;
		// padding: 20rpx 32rpx 28rpx 32rpx;
		flex-flow: column;
		display: flex;
		justify-content: space-between;
		align-items: flex-start;
		position: relative;
		box-shadow: 0rpx 0rpx 20rpx 0rpx rgba(0, 82, 217, 0.3);

		.titleName {
			padding: 20rpx 32rpx 0 32rpx;
			font-weight: 600;
			font-size: 32rpx;
		}

		.companyName {
			width: 686rpx;
			font-family: PingFang SC, PingFang SC;
			font-weight: 600;
			font-size: 36rpx;
			position: relative;
			// color: rgba(0, 0, 0, 0.9);

			input {
				padding: 20rpx 32rpx 20rpx 32rpx;
				width: 622rpx;
				color: #3D3D3D;
			}

			.close {
				right: 0;
				padding: 20rpx;
				position: absolute;
				width: 42rpx;
				height: 42rpx;
			}

			.icon-icon-qingchu {
				font-size: 36rpx;
				color: rgba(0, 0, 0, 0.40);
			}
		}

		.companyPrick {
			box-shadow: 0rpx 0rpx 20rpx 0rpx rgba(0, 82, 217, 0.3);
			z-index: 99;
			left: 0rpx;
			position: absolute;
			top: 140rpx;
			width: 622rpx;
			min-height: 60rpx;
			max-height: 400rpx;
			background: #FFFFFF;
			border-radius: 16rpx;
			padding: 20rpx 32rpx;

			.companyPrick-item {
				padding: 20rpx 0;
				font-family: PingFang SC, PingFang SC;
				font-weight: 600;
				font-size: 32rpx;
				color: #3D3D3D;
			}
		}
	}

	.rowTime {
		display: flex;
		flex-flow: row;
		justify-content: space-between;
		align-items: center;
	}

	.hightLight {
		color: rgba(0, 82, 217, 1);
	}

	.triangle {
		z-index: 100;
		position: absolute;
		top: 120rpx;
		right: 68rpx;
		width: 0;
		height: 0;
		border-left: 10px solid transparent;
		border-right: 10px solid transparent;
		border-bottom: 10px solid white;
	}
	
	.placeholderClass{
		color: rgba(0,0,0,0.26) !important;
	}
</style>

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

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

相关文章

xargs 传参

xargs的默认命令是 echo&#xff0c;空格是默认定界符。这意味着通过管道传递给 xargs的输入将会包含换行和空白&#xff0c;不过通过 xargs 的处理&#xff0c;换行和空白将被空格取代。xargs是构建单行命令的重要组件之一。 xargs -n1 // 一次输出一个参数到一行&#xf…

qmt量化交易策略小白学习笔记第47期【qmt编程之期货仓单】

qmt编程之获取期货数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 期货仓单 提示 1…

使用Python selenium爬虫领英数据,并进行AI岗位数据挖掘

随着OpenAI大火&#xff0c;从事AI开发的人趋之若鹜&#xff0c;这次使用Python selenium抓取了领英上几万条岗位薪资数据&#xff0c;并使用Pandas、matplotlib、seaborn等库进行可视化探索分析。 但领英设置了一些反爬措施&#xff0c;对IP进行限制封禁&#xff0c;因此会用到…

mysql 某个时间字段取值时间标识的字符串的值

SELECT STR_TO_DATE(substr(out_trade_no, 1,14), %Y-%m-%d %H:%i:%s) FROM o_order WHERE id 364457; UPDATE o_order SET created_time DATE_FORMAT(STR_TO_DATE(substr(out_trade_no, 1,14), %Y%m%d %H%i%s), %Y-%m-%d %H:%i:%s) WHERE id 364457; 举例&#xff1a; 1…

五种实用方法!手把手教你系统盘瘦身

随着电脑的使用时间变长&#xff0c;电脑硬盘会逐渐被各种类型的数据占满&#xff0c;其中系统盘的可用空间也在慢慢变小。这是因为系统在运行过程中会产生大量临时文件和缓存文件&#xff0c;同时&#xff0c;系统的每一次更新升级也都会生成相关的文件夹存放在系统盘中&#…

高阶图神经网络 (HOGNN) 的概念、分类和比较

图神经网络&#xff08;GNNs&#xff09;是一类强大的深度学习&#xff08;DL&#xff09;模型&#xff0c;用于对相互连接的图数据集进行分类和回归。它们已被用于研究人类互动、分析蛋白质结构、设计化合物、发现药物、识别入侵机器、模拟单词之间的关系、寻找有效的交通路线…

AI/ML 数据湖参考架构架构师指南

这篇文章的缩写版本于 2024 年 3 月 19 日出现在 The New Stack 上。 在企业人工智能中&#xff0c;主要有两种类型的模型&#xff1a;判别模型和生成模型。判别模型用于对数据进行分类或预测&#xff0c;而生成模型用于创建新数据。尽管生成式人工智能最近占据了新闻的主导地…

excel基本操作

excel 若要取消在数据表中进行的所有筛选 步骤操作&#xff1a; 单击“数据”选项卡。在“排序和筛选”组中&#xff0c;找到“清除”按钮。点击“清除”按钮。 图例&#xff1a; 将文本文件的数据导入到Excel工作表中进行数据处理 步骤&#xff1a; 在Excel中&#xff0c…

DevEco鸿蒙开发请求网络交互设置

首先&#xff0c;在鸿蒙项目下config.json中找到module项&#xff0c;在里面填写"reqPermissions": [{"name": "ohos.permission.INTERNET"}] 在页面对应js文件内&#xff0c;填写import fetch from system.fetch;。 GET和POST区别 GET将表单数…

下班时间如何安排?

随着互联网的飞速发展和数字化时代的来临&#xff0c;越来越多的人开始探索除了主业以外的赚钱途径&#xff0c;以增加收入来源。本文将为您介绍几种当前热门的高薪副业项目&#xff0c;包括网络任务赚钱、开设个人网店、电商导购推广、在线辅导教学、技能变现服务、视频创作分…

机械硬盘和固态硬盘的区别及判断硬盘类型的方法

HDD&#xff08;机械硬盘&#xff09;和 SSD&#xff08;固态硬盘&#xff09;的主要区别 存储介质 HDD&#xff1a;使用磁性盘片&#xff08;磁盘&#xff09;和机械读写头SSD&#xff1a;使用闪存芯片 速度 HDD&#xff1a;读写速度较慢&#xff0c;因为需要机械读写头在…

rttys服务器和客户端

rttys服务器 1.下载 https://github.com/zhaojh329/rttys/releases2.解压运行 libev交叉编译 cd libev ./configure --hostarm-linux CCaarch64-poky-linux-gcc --prefix/home/michael/rtty_install make install DESTDIR/home/michael/rtty_installrtty客户端 1.git地…

人工智能对决:ChatGLM与ChatGPT,探索发展历程

图: a robot is writing code on a horse, By 禅与计算机程序设计艺术 目录 ChatGLM:

Modbus协议转Profibus协议网关模块连PLC与激光发射器通讯

一、概述 在PLC控制系统中&#xff0c;从站设备通常以Modbus协议&#xff0c;ModbusTCP协议&#xff0c;Profinet协议&#xff0c;Profibus协议&#xff0c;Profibus DP协议&#xff0c;EtherCAT协议&#xff0c;EtherNET协议等。本文将重点探讨PLC连接Modbus协议转Profibus协…

visualbox搭建linux环境双网卡配置

文章目录 1. 双网卡模式简介2. 网络模式配置2.1 virtualBox说明2.2 host-only网络模式配置2.3 NAT网络模式配置 3. 虚拟主机网络设置3.1 网卡一设置3.2 网卡二设置 4. 网卡配置5. ssh访问 本篇的目的是为了搭建本地的linux测试环境用。 1. 双网卡模式简介 双网卡网络模式简介 …

【C++ | 重载运算符】一文弄懂C++运算符重载,怎样声明、定义运算符,重载为友元函数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-21 2…

数据库讲解---(数据库保护)【下】

目录 一.并发控制 1.1并发操作引发的问题 1.1.1丢失修改 1.1.2不可重复读 1.1.3读”脏“数据 1.2调度及其可串行化 1.3事务的隔离性级别 1.4封锁技术【重要】 1.4.1排他锁 1.4.2共享锁 1.5封锁协议 1.5.1一级封锁协议 1.5.2二级封锁协议 1.5.3三级封锁协议 1.5.…

全新的会声会影2024最新官方免费永久破解版本下载

大家好&#xff01;&#x1f31f; 今天要跟大家分享一个超级棒的视频编辑软件&#xff0c;它就是全新的会声会影2024最新永久破解版本。作为视频创作爱好者的我&#xff0c;真的被这款软件的强大功能和便利性彻底征服了&#xff01;&#x1f389;&#x1f389;&#x1f3ac; 【…

什么是OAuth2分布式授权协议?

今天我将和大家一起探讨在系统安全领域非常常见的一种授权协议&#xff0c;这就是OAuth2协议&#xff0c;这个协议通常用于对请求访问进行安全控制。在引入这个协议之前&#xff0c;让我们先来回顾两个基本概念&#xff0c;一个是认证&#xff0c;一个是授权。这两个概念比较容…

【Splitpanes】Vue.js 靠谱、简单并支持触摸的窗格分割器/调整器。

【Splitpanes】Vue.js 靠谱、简单并支持触摸的窗格分割器/调整器。 介绍安装使用示例与文档 介绍 Vue.js 靠谱、简单并支持触摸的窗格分割器/调整器。用于实现可调节窗口&#xff0c;支持Vue2、Vue3。 安装 Vue3 npm install splitpanesVue2 npm install splitpaneslegac…