HarmonyOS开发实战:小分享-DiscoverPage发现页——搜索栏+推荐模板+热门分享
前言发现页是用户探索新内容的入口包含搜索栏、推荐模板横向滑动、热门分享列表等模块。小分享 App 的 DiscoverPage 使用 TextInput 实现搜索横向 Scroll 展示推荐模板。本篇讲解搜索栏设计、横向模板滑动、热门分享卡片等。详细 API 可参考 HarmonyOS TextInput 官方文档。一、DiscoverPage 完整代码import router from ohos.router; import { BottomTabBar } from ../components/BottomTabBar; import { RecommendTemplateItem, HotShareItem } from ../common/interfaces; Entry Component struct DiscoverPage { State searchKey: string ; private recommendTemplates: ArrayRecommendTemplateItem [ { title: 水墨古风, color: #FFF8F0 }, { title: 简约现代, color: #F0F8FF }, { title: 文艺清新, color: #F0FFF0 }, { title: 节日喜庆, color: #FFF0F5 } ]; private hotShares: ArrayHotShareItem [ { author: 文艺青年, content: 生活不在别处当下即是全部。 }, { author: 旅行达人, content: 世界那么大我想去看看。 }, { author: 美食博主, content: 唯有美食与爱不可辜负。 } ]; build() { Column() { // Header 搜索栏 Column({ space: 12 }) { Row() { Text(发现).fontSize(20).fontWeight(FontWeight.Bold).fontColor(#1A1A1A).layoutWeight(1) Text().fontSize(22) } .width(100%).padding({ left: 20, right: 20, top: 12, bottom: 8 }) Row({ space: 8 }) { Text().fontSize(16).fontColor(#999999) TextInput({ placeholder: 搜索内容、模板、用户, text: this.searchKey }) .fontSize(14).backgroundColor(Color.Transparent).layoutWeight(1) .onChange((value: string) { this.searchKey value }) } .width(100%).height(40).backgroundColor(#F5F5F5).borderRadius(20) .padding({ left: 16, right: 16 }).margin({ left: 20, right: 20, bottom: 12 }) } .backgroundColor(Color.White) Scroll() { Column({ space: 20 }) { // 推荐模板 Column({ space: 12 }) { Row() { Text(精选模板推荐).fontSize(16).fontWeight(FontWeight.Bold).fontColor(#1A1A1A).layoutWeight(1) Text(更多 ›).fontSize(13).fontColor(#F5A623) .onClick(() { router.pushUrl({ url: pages/TemplateSelectPage }) }) } .width(100%).padding({ left: 20, right: 20 }) Scroll() { Row({ space: 12 }) { ForEach(this.recommendTemplates, (item: RecommendTemplateItem, index: number) { Column({ space: 8 }) { Column() { Text().fontSize(36) } .width(120).height(80).backgroundColor(item.color).borderRadius(12) .justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center) Text(item.title).fontSize(12).fontColor(#666666) } .onClick(() { router.pushUrl({ url: pages/TemplateDetailPage }) }) }, (item: RecommendTemplateItem, index: number) item.title) } .padding({ left: 20, right: 20 }) } .scrollable(ScrollDirection.Horizontal).scrollBar(BarState.Off) } // 热门分享 Column({ space: 12 }) { Row() { Text(热门分享).fontSize(16).fontWeight(FontWeight.Bold).fontColor(#1A1A1A).layoutWeight(1) Text(更多 ›).fontSize(13).fontColor(#F5A623) } .width(100%).padding({ left: 20, right: 20 }) ForEach(this.hotShares, (item: HotShareItem, index: number) { Column({ space: 8 }) { Row({ space: 10 }) { Column() { Text().fontSize(16) } .width(32).height(32).backgroundColor(#F5A623).borderRadius(16) .justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center) Text(item.author).fontSize(13).fontColor(#666666).layoutWeight(1) } .width(100%) Text(item.content).fontSize(15).fontColor(#1A1A1A).width(100%) } .width(100%).padding(16).backgroundColor(Color.White).borderRadius(12) .margin({ left: 20, right: 20 }) }, (item: HotShareItem, index: number) ${item.author}_${index}) } } .padding({ bottom: 80 }) } .layoutWeight(1).scrollBar(BarState.Off) BottomTabBar({ currentIndex: 1 }) } .width(100%).height(100%).backgroundColor(#F5F5F5) } }二、搜索栏设计2.1 TextInput 搜索框TextInput({ placeholder: 搜索内容、模板、用户, text: this.searchKey }) .fontSize(14).backgroundColor(Color.Transparent).layoutWeight(1) .onChange((value: string) { this.searchKey value })2.2 搜索栏容器Row({ space: 8 }) { Text().fontSize(16).fontColor(#999999) TextInput({ placeholder: 搜索..., text: this.searchKey }).layoutWeight(1) } .width(100%).height(40).backgroundColor(#F5F5F5).borderRadius(20) .padding({ left: 16, right: 16 })三、推荐模板横向滑动3.1 横向 ScrollScroll() { Row({ space: 12 }) { ForEach(this.recommendTemplates, (item) { Column({ space: 8 }) { Column() { Text().fontSize(36) } .width(120).height(80).backgroundColor(item.color).borderRadius(12) Text(item.title).fontSize(12).fontColor(#666666) } .onClick(() { router.pushUrl({ url: pages/TemplateDetailPage }) }) }) } .padding({ left: 20, right: 20 }) } .scrollable(ScrollDirection.Horizontal).scrollBar(BarState.Off)四、热门分享卡片Column({ space: 8 }) { Row({ space: 10 }) { Column() { Text().fontSize(16) } .width(32).height(32).backgroundColor(#F5A623).borderRadius(16) Text(item.author).fontSize(13).fontColor(#666666).layoutWeight(1) } Text(item.content).fontSize(15).fontColor(#1A1A1A) } .width(100%).padding(16).backgroundColor(Color.White).borderRadius(12)五、本文核心知识点5.1 发现页核心要点TextInput 搜索框圆角 20横向 Scroll 展示推荐模板热门分享卡片白色背景圆角5.2 实战开发要点搜索栏使用 State 绑定输入横向 Scroll 设置 scrollable(Horizontal)更多链接用›箭头附录发现页的完整实现细节1. 完整的页面布局结构Column (主容器背景 #F5F5F5) ├─ Column (搜索栏区白色背景) │ ├─ Row (Header) │ │ ├─ Text(发现) 标题 │ │ └─ Text() 搜索图标 │ └─ Row (搜索框) │ ├─ Text() 16px 灰色 │ └─ TextInput (输入框) ├─ Scroll (可滚动内容区) - layoutWeight(1) │ └─ Column (space: 20) │ ├─ Column (推荐模板区) │ │ ├─ Row (标题 更多) │ │ └─ Scroll (横向滑动) │ │ └─ Row (模板卡片列表) │ └─ Column (热门分享区) │ ├─ Row (标题 更多) │ └─ Column (分享卡片列表) └─ BottomTabBar (底部导航) - currentIndex: 12. 搜索栏的完整实现Row({ space: 8 }) { Text().fontSize(16).fontColor(#999999) TextInput({ placeholder: 搜索内容、模板、用户, text: this.searchKey }) .fontSize(14).backgroundColor(Color.Transparent).layoutWeight(1) .onChange((value: string) { this.searchKey value }) } .width(100%).height(40).backgroundColor(#F5F5F5).borderRadius(20) .padding({ left: 16, right: 16 }).margin({ left: 20, right: 20, bottom: 12 })3. 推荐模板横向滑动Scroll() { Row({ space: 12 }) { ForEach(this.recommendTemplates, (item: RecommendTemplateItem) { Column({ space: 8 }) { Column() { Text().fontSize(36) } .width(120).height(80).backgroundColor(item.color).borderRadius(12) Text(item.title).fontSize(12).fontColor(#666666) } .onClick(() { router.pushUrl({ url: pages/TemplateDetailPage }) }) }, (item: RecommendTemplateItem) item.title) } .padding({ left: 20, right: 20 }) } .scrollable(ScrollDirection.Horizontal).scrollBar(BarState.Off)4. 热门分享卡片Column({ space: 8 }) { Row({ space: 10 }) { Column() { Text().fontSize(16) } .width(32).height(32).backgroundColor(#F5A623).borderRadius(16) Text(item.author).fontSize(13).fontColor(#666666).layoutWeight(1) } Text(item.content).fontSize(15).fontColor(#1A1A1A) } .width(100%).padding(16).backgroundColor(Color.White).borderRadius(12) .margin({ left: 20, right: 20 })5. 数据模型export interface RecommendTemplateItem { title: string; color: string; } export interface HotShareItem { author: string; content: string; }6. 完整代码文件索引文件路径说明pages/DiscoverPage.ets发现页common/interfaces.ets接口定义components/BottomTabBar.ets底部导航7. 本文涉及的所有 APIAPI/组件用途文档链接TextInput搜索输入TextInputScroll横向滚动ScrollState状态管理State Guiderouter.pushUrl()路由跳转RouterForEach循环渲染ForEachBottomTabBar底部导航自定义组件8. 实现要点总结发现页的核心实现要点搜索栏TextInput 组件圆角 20灰色背景推荐模板横向 Scroll 滑动固定宽度 120px热门分享白色卡片圆形头像 内容文字State 管理searchKey绑定搜索输入底部导航BottomTabBar currentIndex: 19. 总结本文详细讲解了 DiscoverPage 发现页的完整实现涵盖搜索栏、推荐模板横向滑动、热门分享卡片等核心功能。相关资源HarmonyOS TextInput 官方文档TextInput ReferenceHarmonyOS Scroll 组件Scroll ComponentHarmonyOS State 装饰器State GuideHarmonyOS Router 路由Router APIHarmonyOS ForEach 渲染ForEach ReferenceHarmonyOS Row 组件Row ComponentHarmonyOS borderRadius 属性BorderRadius开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net总结本文详细讲解了小分享 App 中对应功能的完整实现。通过本文的学习读者可以掌握 HarmonyOS 开发的核心 API 使用方法和最佳实践并能够独立实现类似功能。在实际开发中建议读者结合官方文档深入理解每个 API 的参数含义和适用场景并在项目中灵活运用。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力

相关新闻

华为MetaERP Oracle EBS R12 月结全流程(含操作路径 + 关键报表)+ 各模块标准会计分录(含月结特有分录)。内容偏实务、偏核算,分录用 “借 / 贷” 清晰列出,方便你直接对照做

华为MetaERP Oracle EBS R12 月结全流程(含操作路径 + 关键报表)+ 各模块标准会计分录(含月结特有分录)。内容偏实务、偏核算,分录用 “借 / 贷” 清晰列出,方便你直接对照做

Oracle EBS R12 月结全流程(含操作路径 关键报表) 各模块标准会计分录(含月结特有分录)。内容偏实务、偏核算,分录用 “借 / 贷” 清晰列出,方便你直接对照做账。一、Oracle EBS 月结整体顺序(…

2026/7/24 20:42:39阅读更多 →
HarmonyOS开发实战:小分享-TemplateSelectPage模板选择——分类Tab+Grid网格

HarmonyOS开发实战:小分享-TemplateSelectPage模板选择——分类Tab+Grid网格

前言 欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 模板选择页 让用户从丰富的模板库中选择喜欢的样式,支持分类筛选和网格预览。小分享 App 的 TemplateSelectPage 使用 Grid 组件 实现三列网格布局,通过 Tab 分…

2026/7/24 20:42:39阅读更多 →
病理图片处理代码HistoQC使用记录

病理图片处理代码HistoQC使用记录

HistoQC源代码地址:https://github.com/choosehappy/HistoQC 2026.7.23更新 官网更新了代码,官网给了一套安装教程,不过如果按照官网的安装教程会有各种各样的问题!!!特来更新。docker没有尝试&#xff0…

2026/7/24 20:40:38阅读更多 →
DP83TC811R-Q1以太网PHY芯片RGMII与SMI接口配置实战指南

DP83TC811R-Q1以太网PHY芯片RGMII与SMI接口配置实战指南

1. 项目概述与核心价值在嵌入式网络设备开发中,选对一颗PHY芯片只是第一步,真正让它在你的板子上“活”起来,跑得稳,才是工程师价值的体现。我最近在几个车载网关和工业控制器的项目里,都深度使用了德州仪器的DP83TC81…

2026/7/24 22:02:52阅读更多 →
入门高速PCB设计一

入门高速PCB设计一

文章目录一、如何判别信号是否为高速信号?二、传输线类别2.1 共轴传输线2.2 微带线2.3 带状线三、什么是特性阻抗?3.1 传输线与特性阻抗的关系3.2 特性阻抗与哪些因素有关3.3 PCB如何计算特性阻抗3.4 不控阻抗会造成什么影响3.5 特性阻抗分了哪几种类型四…

2026/7/24 22:02:52阅读更多 →
Mac NTFS读写革命:开源工具Nigate如何颠覆你的跨平台文件传输体验

Mac NTFS读写革命:开源工具Nigate如何颠覆你的跨平台文件传输体验

Mac NTFS读写革命:开源工具Nigate如何颠覆你的跨平台文件传输体验 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and ma…

2026/7/24 22:02:52阅读更多 →
DLP3010 DMD芯片组:光学接口、热管理与系统可靠性设计实践

DLP3010 DMD芯片组:光学接口、热管理与系统可靠性设计实践

1. DLP3010 DMD芯片组:从微镜到系统的工程实践如果你正在设计一个微型投影仪、3D打印机的光固化单元,或者任何需要高速、高精度空间光调制的系统,那么德州仪器(TI)的DLP技术很可能在你的候选名单上。DLP3010作为一款0.…

2026/7/24 22:02:52阅读更多 →
打造健康办公环境哪家强?2026年智慧办公环境服务商实力TOP5测评

打造健康办公环境哪家强?2026年智慧办公环境服务商实力TOP5测评

2026年,参考世界经济论坛与麦肯锡健康研究院联合发布的《Thriving Workplaces: How Employers can Improve Productivity and Change Lives》研究结论,以及中国建筑装饰协会行业报告中的空间健康化评估方法可见,国内办公空间健康化升级需求持…

2026/7/24 22:02:52阅读更多 →
AI食用菌培育智能巡检机器人 Qt完整项目

AI食用菌培育智能巡检机器人 Qt完整项目

# AI食用菌培育智能巡检机器人 Qt完整项目 ## 项目定位 适配工控,面向**食用菌培育工**,AI菌房巡检机器人上位监控系统;覆盖菌房恒温恒湿机组、CO₂通风风机、雾化加湿设备、灭菌锅、接种超净台、木屑粉碎机整套培育产线监控、AI病害+设备双故障诊断、无菌化标准化维保工单…

2026/7/24 22:00:52阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 0:58:53阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 0:58:53阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 0:58:53阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述: 解法: 1、模拟(参考自【LeetCode 54】螺旋矩阵-CSDN博客) int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会,昔日AI六小龙来了五家,分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了,唯一缺席的竟是近几个月来风光无限的智谱。(DeepSeek一直不参加)WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/23 22:58:43阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →