
一、应用概述与功能
1.1 应用简介
本案例(index51)是一个基于 HarmonyOS NEXT 平台开发的折叠面板与步骤指示器演示应用,完整展示了 ArkUI 中 Collapse、Step、Stepper、FlowItem 等重要布局组件的使用方法。应用以问答列表的形式呈现,支持手风琴式折叠展开,同时通过步骤指示器引导用户完成多步骤操作流程,涵盖了从基础布局到交互控制的全方位技术要点。
1.2 核心功能点
- Collapse 折叠面板:实现问答列表的展开/收起动画效果
- 手风琴模式:一次只能展开一个面板,其他自动收起
- Step 步骤组件:展示多步骤进度指示器
- Stepper 步进器:控制步骤的前进和后退
- FlowItem 流式布局:自适应排列多个步骤标签
- 状态管理:使用 @State 和 @Watch 实现响应式状态更新
- 动画过渡:展开/收起时的平滑动画效果
- 自定义样式:面板标题、内容区域的差异化样式
1.3 技术亮点
应用综合运用了 ArkUI 的折叠布局体系,从简单的单面板展示到复杂的手风琴式多面板管理,再结合步骤指示器引导用户完成操作流程。通过 @Watch 装饰器实现状态监听,当展开项变化时自动更新 UI。整体布局采用 Column 嵌套结构,内部配合 Scroll 实现内容的滚动浏览。
二、核心知识点
2.1 Collapse 组件体系
Collapse 是 ArkUI 中用于创建可折叠内容面板的基础组件,由 Collapse 容器和其子组件 FlowItem 组成。FlowItem 代表每个可折叠的单元,包含标题和内容两个部分。
2.2 手风琴交互模式
手风琴模式(Accordion)是一种常见的 UI 交互模式,特点是同一时间只能有一个面板处于展开状态,新面板展开时其他面板自动收起。这种模式适用于节省屏幕空间的场景,如 FAQ 列表、设置项集合等。
2.3 @Watch 状态监听
@Watch 装饰器用于监听状态变量的变化,当被修饰的状态值发生改变时,指定的回调函数会自动执行。这在需要根据状态变化触发副作用(如动画、数据更新)时非常有用。
三、源码逐段解析
3.1 数据模型定义
应用首先定义了问答条目的数据结构 QAItem,包含 id、question 和 answer 三个字段,以及 ExpandedItem 枚举定义了可展开的面板 ID。问答数据包含了 ArkUI 开发中的常见问题,如 TextInput 无法输入文字、文字超出容器处理、Button 显示不全、List 滚动卡顿等问题的解决方案。
3.2 @Entry 组件结构
CollapseExample 组件使用 @Entry 装饰器标记为页面入口,使用 @State currentExpanded 追踪当前展开的面板 ID,@Watch('currentExpanded') 监听变化并打印日志。
3.3 构建方法解析
build 方法构建了三部分内容:
- 标题区域:"ArkUI 折叠面板与步进器"
- 折叠面板列表:使用 ForEach 遍历 QAItem 数据,每个 FlowItem 包含标题栏(Row 布局,显示问题文本和展开箭头)和内容区域(padding 包裹的答案文本)
- 步骤指示器区域:使用 Column 堆叠 Step 组件,每个步骤显示序号和文字标签
3.4 折叠面板交互
点击 FlowItem 的标题栏时,通过 this.currentExpanded === item.id ? 0 : 1 切换展开状态(0 展开,1 收起),利用 @Watch 监听实现状态变化的日志记录。
3.5 步骤指示器
Step 组件通过 current 属性控制当前步骤,onChange 回调响应步骤切换。支持在步骤图标上叠加数字或图标,形成可视化进度指示。
四、UI 布局与交互设计
4.1 整体布局
采用 Column 纵向布局,内部包含标题、折叠面板区域和步骤指示器区域三部分,各部分之间使用 Blank() 或固定间距分隔。
4.2 折叠面板样式
每个 FlowItem 的标题栏使用 Row 布局,左侧显示问题文本,右侧显示展开/收起的箭头图标(使用 > 符号表示)。内容区域使用 padding 和圆角容器包裹,提供视觉层次感。
4.3 步骤指示器样式
Step 组件使用序号填充的圆形图标,文字标签显示在步骤下方,步骤之间通过连线连接形成流程感。
五、状态管理与数据流
5.1 单一数据源
所有 UI 状态由 currentExpanded 这一 @State 变量统一管理,确保数据流向清晰。
5.2 单向数据流
用户交互触发状态变化 → @Watch 回调记录日志 → UI 根据状态重新渲染,形成单向数据流动。
六、性能优化策略
6.1 懒加载
折叠面板内容仅在展开时渲染,收起时内容区域被隐藏,减少不必要的渲染开销。
6.2 虚拟滚动
当问答列表较长时,使用 Scroll 组件配合性能优化,确保流畅滚动体验。
七、完整代码实现
typescript
// QAItem 数据模型定义
interface QAItem {
id: ExpandedItem;
question: string;
answer: string;
}
// ExpandedItem 枚举
enum ExpandedItem {
Item1, Item2, Item3, Item4, Item5
}
// @Entry 组件
@Entry
@Component
struct CollapseExample {
@State currentExpanded: ExpandedItem = ExpandedItem.Item1;
build() {
Column() {
Text('ArkUI 折叠面板与步进器')
.fontSize(24)
.fontWeight(FontWeight.Bold)
.margin({ top: 16, bottom: 16 });
// 折叠面板列表
Collapse() {
ForEach(this.qaList, (item: QAItem) => {
FlowItem() {
Row() {
Text(item.question)
.layoutWeight(1)
.fontSize(16);
Text(this.currentExpanded === item.id ? '▾' : '▸')
.fontSize(18)
.foregroundColor(Color.Gray);
}
.width('100%')
.padding(16);
Column() {
Text(item.answer)
.fontSize(14)
.lineHeight(22);
}
.width('100%')
.padding(16)
.backgroundColor('#F5F5F5')
.borderRadius(8);
}
.itemId(String(item.id))
.collapsedHeight(0)
.expandedHeight(200)
.expand(this.currentExpanded === item.id ? 0 : 1);
});
}
.accordion(true)
.width('100%');
// 步骤指示器
Text('步骤指示器示例')
.fontSize(18)
.margin({ top: 24 });
Column() {
ForEach(this.steps, (step: string, index: number) => {
Step() {
Text(String(index + 1))
.fontSize(16)
.fontColor(Color.White);
}
.title(step)
.current(index === this.currentStep ? true : false);
});
}
.width('80%');
}
.width('100%')
.height('100%')
.padding(16);
}
}
八、测试与调试
8.1 功能测试要点
- 验证手风琴模式是否正常工作(同时只有一个面板展开)
- 测试点击标题后面板的展开/收起动画
- 确认 @Watch 回调在状态变化时正确触发
- 测试步骤指示器的当前步骤高亮效果
- 验证不同屏幕尺寸下的自适应布局
8.2 常见问题排查
- 面板无法展开:检查 expand 属性值是否正确(0 表示展开)
- 动画卡顿:减少面板内容的复杂度,避免在展开时执行耗时操作
- 状态未更新:确保 @Watch 装饰器的回调函数正确注册
九、可扩展方向
9.1 功能扩展
- 搜索过滤:在面板列表顶部添加搜索框,支持按问题关键字过滤
- 收藏功能:为常用问答添加收藏标记
- 分类标签:将问答按主题分类,支持分类筛选
- 分享功能:支持将问答内容分享给其他应用
9.2 视觉增强
- 动画效果:为展开/收起添加更丰富的过渡动画(如渐变、缩放)
- 图标装饰:在标题前添加问题类型图标
- 暗色模式:适配暗色主题,调整颜色方案
- 响应式设计:根据屏幕尺寸调整面板高度和字体大小
9.3 数据持久化
- 本地存储:使用 Preferences 将问答列表保存到本地
- 云端同步:接入云服务,实现多设备数据同步
- 离线浏览:缓存问答内容,支持离线查看
9.4 高级交互
- 拖拽排序:支持用户自定义问答的排列顺序
- 批量操作:支持批量展开/收起所有面板
- 键盘导航:支持物理键盘的上下箭头切换面板
十、总结与经验
通过开发 index51 折叠面板案例,我们深入学习了 ArkUI 中 Collapse、FlowItem、Step、Stepper 等布局组件的使用方法。核心要点包括:手风琴模式的实现原理、@Watch 状态监听机制、FlowItem 的展开高度控制、以及步骤指示器的进度表达。在实际应用中,应根据场景选择合适的折叠模式,合理使用 @Watch 处理状态变化副作用,并通过性能优化确保在大量面板情况下仍能流畅运行。这个案例为构建复杂的可折叠界面提供了坚实的技术基础。