96SEO 2026-02-19 08:34 0
怎么样是不是还挺不错的那么这篇文章就讲讲这样一个搜索展示的功能是如何实现的。

输入关键字匹配对应的卡片展示匹配的卡片上面要把符合搜索条件的所有词给高亮展示出来不然文本多的时候容易看花了。
点击匹配到的卡片要跳转到卡片的位置并且闪烁两下这样一看就知道要找卡片在哪了。
我的小程序目前是纯前端搜索的只是目前是这样所以搜索逻辑也是在前端实现。
搜索逻辑如果简单实现的话就是将搜索框的内容与列表中的每一项进行对比看看内容中有没有包含这个字符串的如果有就把这个项给返回回去。
cardDataStore.cardBoxList.map((cardBox)
对每个卡片盒子创建一个新对象包含原始属性和修改后的卡片项目return
映射并过滤卡片项目只保留匹配搜索文本的项目cardItems:
cardBox.cardItems.map((cardItem)
searchTextRegex.exec(cardItem.frontContent))
记录每个匹配项的起始和结束索引frontMatches.push({startIndex:
属性以便重新搜索searchTextRegex.lastIndex
searchTextRegex.exec(cardItem.backContent))
记录每个匹配项的起始和结束索引backMatches.push({startIndex:
返回一个新的卡片项目对象包含是否匹配和匹配项的位置return
{...cardItem,isMatched,frontMatches,backMatches,}})//
过滤掉没有匹配项目的卡片盒子filteredCards.value
如果没有搜索文本则清空过滤后的卡片列表filteredCards.value
通过传入的搜索文本和标志‘giu’创建一个新的正则表达式对象。
g全局搜索标志表示搜索整个字符串中的所有匹配项而不是在找到第一个匹配项后停止。
searchTextRegex.exec(cardItem.frontContent))
searchTextRegex.exec(cardItem.frontContent)
方法返回一个数组其中第一个元素match[0]是找到的匹配文本index
在每次循环迭代中都会找到一个匹配项。
startIndex匹配项在
中的结束位置即起始位置加上匹配文本的长度。
frontMatches.push(...)将包含起始和结束索引的对象添加到
经过这么一番操作我们就可以获得一个筛选后的数组其中包含了所有匹配的项每个项还有一个二维数组用来记录匹配位置开头结尾的索引
}[]})[]为什么要大费周章的记录这个索引呢那是因为下一步需要用到接下来说说关键词高亮的展示
关键词高亮需要在字符串的某几个字符中更改它的样式因此我们上一步才需要记录一下需要高亮的字符串开始和结束的位置如此一来我们做这个高亮的组件就不用再执行一次匹配了。
那么这个样式要如何实现呢我们需要遍历这个字符串在需要高亮的字增加额外的样式最后再重新拼接成一个字符串。
flex-wrapviewv-for(charWithStyle,
styledTextclasstext-sm:keyindex:classcharWithStyle.isMatched
textArray[arrIndex].lengtharrIndex
去遍历会把它的结构给拆开最终展示出来的是乱码如果你想正常展示就要用
.length)console.log(Array.from()[0],
正是因为我们第一步中使用正则去匹配字符串的时候是根据表情包字符实际的长度返回的索引值所以我们这里有一个逻辑
textArray[arrIndex].lengtharrIndex
1}如果字符的长度大于一我们就从字符串数组中取值这样表情包就能正常展示了然后维护两个索引一个索引给字符长度大于1的字符用一个给字符长度为1的用根据不同的情况取不同的值这样就能处理好表情包的这种情况了。
下面这种很多个表情包的文本也能在正确的位置高亮
uni.createSelectorQuery().in(instance.proxy)query.select(#card-box-${props.cardBoxIndex}).boundingClientRect((data)
data}).selectViewport().scrollOffset((data)
{uni.pageScrollTo({scrollTop:data[1].scrollTop
有一个回调可以用于滚动到指定位置后执行某个函数那么我们可以在这里设置触发高亮的动画动画的实现如下
view//...:classcardItemStore.scrollToCardItemId
}这里没有使用边框而是使用了内嵌的阴影避免边框会把容器撑大的问题滚动完成后动态给指定元素一个执行动画的
如果不是遇到了表情包长度问题这个搜索功能的实现还是比较简单的重点是交互和设计是否能够让用户快速定位到想找的内容。
目前是纯前端实现而且涉及了很多遍历性能还有待提升不过先实现再优化了。
学习卡盒已经上线了大家可以直接搜索到这个搜索功能也发版了欢迎体验。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback