当前位置: 首页 > news >正文

HarmonyOS APP<玩转React>开源教程二十八:搜索功能实现

第28次:搜索功能实现

本文讲解搜索模块,对应SearchService.etsSearchPage.ets。它的目标不是做互联网级全文检索,而是在本地教程数据范围内,帮助用户快速定位模块和课时。


搜索功能在这个项目里的真实作用

当前搜索功能主要覆盖两个维度:

  • 搜模块
  • 搜课时

它不会去搜开源项目、源码章节、错题本,也没有远程接口。这样的范围其实很合理,因为搜索首先要服务项目最核心的学习主链路。

Index 初始化 modules

SearchService.init(modules)

SearchPage 输入关键词

SearchService.search(query)

模块结果

课时结果

进入 ModuleDetail

进入 LessonDetail


一、为什么搜索服务要在首页初始化时就准备好

SearchService依赖完整的modules数据,所以它在Index.ets的初始化流程里就会被调用:

  • SearchService.init(this.modules)

这样做有两个好处:

  1. 搜索页打开时不需要再重新读取教程数据。
  2. 搜索结果与首页、课程列表页使用的是同一份模块数据,状态一致。

这再次体现了项目里很重要的一个设计原则:统一数据源,多页面复用。


二、搜索服务内部到底做了什么

SearchService.search(query)的逻辑很清楚:

  1. 过滤空查询和纯空白。
  2. 统一转成小写,做简单标准化。
  3. 遍历全部模块。
  4. 如果模块标题或描述命中,就生成模块结果。
  5. 再遍历模块下的全部课时。
  6. 如果课时标题或描述命中,就生成课时结果。

也就是说,当前搜索是一个很典型的本地遍历式搜索。它不复杂,但足够稳定、清晰,而且对于当前数据规模完全够用。


三、为什么结果对象要统一成SearchResult

模块和课时本来是两种不同数据,但搜索结果最终都被组织成统一的SearchResult。这非常重要,因为页面只需要面向一种结果结构去渲染,就不必写两套完全不同的列表逻辑。

SearchResult中常见的关键字段有:

  • type
  • id
  • title
  • description
  • moduleId
  • moduleTitle
  • difficulty
  • matchedText

这说明服务层在帮页面做“格式对齐”。页面只关心怎么显示,不必再自己判断原始数据长什么样。


四、搜索页为什么实时搜索而不是点击按钮搜索

SearchPageTextInputonChange会直接触发performSearch()。这意味着用户边输入,边看到结果变化。

对于当前项目这种纯本地、小数据量搜索来说,这种方式很合适,因为:

  • 反馈快
  • 无需额外点击
  • 交互更自然

如果未来数据量变大,再考虑防抖、分页、索引也不迟。教程写法一定要基于当前项目规模,而不是一上来就过度设计。


五、搜索页为什么要有热门搜索

当输入框为空时,页面不会留下一片空白,而是展示“热门搜索”标签。这有两个好处:

  1. 帮用户快速开始,不知道搜什么时可以直接点。
  2. 提示应用里最核心的知识主题,比如HooksuseStateProps等。

从产品角度看,热门搜索不仅是一个入口,也是一个“内容导览”。它在无输入状态下承担了轻量推荐作用。


六、搜索结果列表为什么区分模块和课时

当前搜索结果用不同图标区分:

  • 模块:📚
  • 课时:📖

并且课时结果还会额外显示所属模块名和难度信息。这一点非常重要,因为用户搜到一个课时时,往往还想知道:

  • 它属于哪个模块
  • 处在什么难度层级

如果没有这些上下文,搜索结果就会显得很碎。当前实现虽然简单,但上下文信息保留得不错,这会让用户更容易判断“这是不是我想找的内容”。


七、当前搜索能力的边界也要讲清楚

教程不能只讲优点,不讲边界。当前搜索实现有几个明显范围:

  • 只搜模块和课时
  • 主要基于标题和描述
  • 匹配方式是简单includes
  • 没有分词、权重排序、拼音搜索

这些都不是缺点,而是当前版本的合理边界。你写教程时应该告诉读者:这是一个面向本地教学数据的小而美搜索,而不是复杂检索引擎。


八、自己实操时怎么验证最有效

  1. 从个人中心进入搜索页。
  2. 不输入内容,先点几个热门搜索词。
  3. 输入模块标题关键词,观察模块结果。
  4. 输入课时关键词,观察课时结果。
  5. 分别点击模块结果和课时结果,确认导航是否正确。

通过这几步,你就能把搜索的“初始化 -> 检索 -> 结果 -> 导航”完整走一遍。


九、本篇常见坑

1. 页面自己拿原始模块数据直接搜

更好的方式是通过SearchService统一封装结果结构。

2. 结果里不区分模块和课时

用户会很难判断应该点哪里。

3. 搜索页空状态不做任何展示

热门搜索能显著提升搜索功能的使用率。

4. 把当前功能吹成“高级搜索”

教程要真实说明当前实现的边界。


本篇小结

搜索模块的价值,不在于算法多复杂,而在于它是否和当前项目的数据结构、使用场景足够匹配。当前项目的搜索功能做到了三件很实用的事:

  • 初始化一次,多页复用
  • 统一结果结构,页面渲染简单
  • 支持从结果直接跳回学习主链路

这就是一个小型教学应用里很合适的搜索设计。


跟着真实源码继续往下看

搜索服务的真实核心逻辑如下:

for(constmoduleofSearchService.allModules){if(SearchService.matchesQuery(module.title,normalizedQuery)||SearchService.matchesQuery(module.description,normalizedQuery)){results.push({type:'module',id:module.id,title:module.title,description:module.description,difficulty:module.difficulty});}

搜索页输入即检索的真实代码如下:

TextInput({placeholder:'搜索课程...',text:this.query}).onChange((value:string)=>{this.query=value;this.performSearch();})

按这个顺序动手

  1. 打开SearchService.ets,先读search()
  2. 再打开SearchPage.ets,看输入框变化如何直接驱动结果刷新。
  3. 最后观察模块结果和课时结果点击后分别跳去哪里。

课后练习

  1. 思考如果要加入“搜索源码章节”,你最想扩展SearchResult的哪些字段。
  2. 说明为什么热门搜索词本质上也属于内容运营的一部分。
  3. 尝试设计一个“最近搜索记录”功能,并说明它更适合放在页面状态还是服务层存储中。
http://www.jsqmd.com/news/577590/

相关文章:

  • 突破限制!3步实现抖音直播回放的高效下载解决方案
  • 2026广东中古风家具定制优质品牌推荐:佛山家具/佛山布艺沙发/佛山沙发/佛山软床/全屋家具/劳伦斯沙发/选择指南 - 优质品牌商家
  • 如何为《以撒的结合:悔改》安装REPENTOGON扩展框架
  • 深入解析DW_apb_i2c与TMP75的寄存器交互:从配置到温度读取
  • 阿里巴巴 P6 Java 面试全流程实录:高并发实战与 Redis Lua 深度解析
  • 3.Blender甜甜圈添加材质+纹理
  • CSDN 程序员真实变现路径:能长期赚到钱的,其实就这几条路
  • 从package.xml到CMakeLists.txt:手把手教你配置一个ROS1机器人控制包(附完整项目模板)
  • 财务知识-财务分析报告流程 - 智慧园区
  • 阿里云百炼平台免费Token领取攻略:手把手教你用通义千问和DeepSeek(附100万额度)
  • 计算机毕业设计:Python二手车市场数据可视化与智能选购系统 Flask框架 requests爬虫 协同过滤推荐算法 可视化 汽车之家 机器学习(建议收藏)✅
  • Spring Boot 3.x 开发中速率限制集成实现详解
  • Load-Use冒险避坑指南:为什么你的RISC流水线转发电路会失效?
  • 游戏数据缓存优化
  • 掌握SQL窗口函数,轻松处理复杂数据分析
  • 2026景区电动观光车优质品牌推荐指南 - 优质品牌商家
  • GmSSL3实战:5分钟搞定SM2证书生成与TLS配置(附完整脚本)
  • Windows 11 文件资源管理器:通过注册表权限管理隐藏主文件夹与图库
  • 为什么传统绩效考核正在被OKR取代?2026年企业目标管理的智能化选择
  • 解决Ubuntu中libc6-dev:i386依赖问题的完整指南
  • Phi-4-mini-reasoning开源生态整合:HuggingFace模型加载+vLLM服务+Chainlit前端
  • MacOS下npm install报unable to get local issuer certificate
  • 2026热搜榜 | 格行随身WIFI代理:副业创业新风口,0门槛高收益! - 格行官方招商总部
  • HoRain云--Julia运算符全解析
  • 引言-从零开始编写操作系统-引导
  • 手把手教你配置 OpenAI Codex CLI:API Key 获取 + 自定义 base_url 保姆级指南
  • 旺季仓容紧张跨境卖家如何提前规划备货与入仓
  • 系统架构设计师-案例分析-Web系统设计
  • 2026年4月档案数字化机构口碑推荐,这份推荐请收好!档案库房/电子合同管理/建设项目档案管理,档案数字化公司哪家好 - 品牌推荐师
  • 临床科研场景下医疗数据安全开放共享平台设计