Vue3纯前端实现搜索功能(名字、手机号)并标红索引
·
业务过程中,一个好的搜索功能必不可少。还啥都想要,又要迷糊搜名字,又要模糊搜手机号。那咱就一下子都给它实现好了。难度就在要标红索引的值。还是需要一点思路想法的。本期说一下搜素功能,下一期直接上一个纯前端实现通讯录的功能尽情期待~~
先上图:


做出来效果还是非常不错的...
熟悉的我的都懂,直接上代码
<template>
<div class="contacts-content">
<div class="search">
<van-search v-model="staffSearch" @update:model-value="getSearchList()" @focus="getSearchPage(false)" @cancel="getSearchPage(true)" :show-action="!searchStatus" placeholder="搜索成员姓名/手机号"> </van-search>
</div>
<div v-show="searchList.length > 0" class="contacts-content-cell" v-for="item in searchList" @click="submit(item)" :key="item.id">
<img :src="item.photo || group" />
<div class="cell-info">
<span class="cell-info-name" :style="data.type && 'color: #EB4D44'" v-for="(data, index) in getSearchProcess(item.name)" :key="index">
{{ data.val }}
</span>
<div>
<span class="cell-info-tel" :style="data.type && 'color: #EB4D44'" v-for="(data, index) in getSearchProcess(item.telephone)" :key="index">
{{ data.val }}
</span>
</div>
</div>
</div>
<div v-show="searchList.length == 0" class="noData">
<span v-show="!staffSearch">搜索成员姓名/手机号</span>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import group from '@assets/img/teamManagement/group.png'
const staffSearch = ref<String>('') // 搜索的字符
const searchList = ref<Array<listType>>([])
const list = ref<Array<listType>>([
{
id: '1',
name: '小王',
telephone: '13333333333',
type: false,
photo: '',
},
{
id: '2',
name: '小刘',
telephone: '13344444444',
type: false,
photo: '',
},
{
id: '3',
name: '小赵',
telephone: '15555555555',
type: false,
photo: '',
},
{
id: '4',
name: '小李',
telephone: '15566666666',
type: false,
photo: '',
},
{
id: '5',
name: '小明',
telephone: '15577777777',
type: false,
photo: '',
},
])
const searchStatus = ref<Boolean>(true) // 搜索的状态, true: 展示最开始的数据 false: 展示搜索的页面
interface listType {
id: string
name: string
telephone: string
type: boolean
photo: string
}
/**
* @param getSearchProcess 对搜索到的数据进行处理 最终其实就是变成一个数组,根据type展示不同颜色就实现了。
* @param val 获取的数据
*/
const getSearchProcess = (val: any) => {
let list = []
if (val) {
// 进行姓名或者手机号进行while循环
while (val) {
// 如果字符中有和搜索的字符相同的,走以下逻辑
if (val.indexOf(staffSearch.value) > -1) {
// 如果相同字符就在第一位序, 是直接push一个搜索的值,打上type: true
if (val.indexOf(staffSearch.value) == 0) {
list.push({ val: staffSearch.value, type: true })
val = val.substr(staffSearch.value.length)
} else {
// 否则先把搜索值前面的值先裁剪掉,打上type: false
list.push({ val: val.substr(0, val.indexOf(staffSearch.value)), type: false })
// 然后这就到搜索的值了, 打上true。 裁剪掉继续循环
list.push({ val: staffSearch.value, type: true })
val = val.substr(val.indexOf(staffSearch.value) + staffSearch.value.length)
}
} else {
list.push({ val: val, type: false })
val = ''
}
}
}
return list
}
/**
* @param getSearchPage 是否进入搜索页面
*/
const getSearchPage = (val: Boolean) => {
searchStatus.value = val
}
/**
* @param getSearchList 获取选中的数据
*/
const getSearchList = () => {
searchList.value = []
if (staffSearch.value) {
list.value.map((item: listType) => {
if (item.name.indexOf(staffSearch.value) > -1 || item.telephone.indexOf(staffSearch.value) > -1) {
searchList.value.push(item)
}
})
}
}
/**
* @param submit 提交逻辑
*/
const submit = (val: listType) => {
console.log(val, '-----------提交-----------')
}
</script>
<style scoped lang="less">
.contacts-content {
height: 100%;
display: flex;
flex-direction: column;
color: #000000;
.search {
height: 50px;
.van-search__content {
border-radius: 4px;
}
}
&-cell {
margin-bottom: 8px;
background: #fff;
padding: 20px 12px;
display: flex;
align-items: center;
img {
height: 44px;
width: 44px;
}
.cell-info {
margin-left: 12px;
&-name {
font-size: 16px;
margin-bottom: 4px;
color: rgba(0, 0, 0, 0.9);
}
&-tel {
margin-bottom: 4px;
color: rgba(0, 0, 0, 0.4);
}
}
}
.noData {
text-align: center;
margin-top: 50%;
span {
opacity: 0.3;
}
}
}
</style>
以下是核心思路
首次加载时
1. 通过getSearchList()进行筛选,根据名字和手机号筛选出模糊搜索的值。
2. 用getSearchProcess()对模糊出来的值进行处理。
对值进行分割,例:搜索的值为 '44444', 则处理成[{ val: 1, type:false}, {val: '3333', type: true}, {val: '44444', type: false}]。 通过遍历,把标识type为true的更改颜色,就实现了本功能了。
以上就是该功能的描述,不清楚的也可以在评论区说,我会进行回复。还是很好玩的小功能。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)