项目源码已开源(持续更新中~~): https://gitcode.com/nutpi/HarmonyosNextCaseStudyTutorial
项目演示
注意: 项目需要再真机或模拟器中运行, 否则会出现部分图片无法展示的问题
一、概述
在HarmonyOS Next开发者手册应用中,二级页面是连接首页和具体案例详情的重要桥梁。本文将深入分析/secondPage
目录中的三个核心文件:BasicCaseList.ets
、AdvancedCaseList.ets
和HybridCaseList.ets
。这三个文件分别对应应用中的三个学习阶段:萌新小白、登堂入室和进阶高手。通过对这些页面的分析,我们可以了解HarmonyOS应用的页面导航结构、UI组件使用以及数据流设计。
二、文件结构分析
1. 目录结构
/secondPage/
├── BasicCaseList.ets // 萌新小白阶段案例列表
├── AdvancedCaseList.ets // 登堂入室阶段案例列表
└── HybridCaseList.ets // 进阶高手阶段案例列表
这三个文件构成了应用的二级导航层,每个文件对应一个学习阶段的案例列表页面。
2. 导入声明
以BasicCaseList.ets
为例,文件开头的导入声明如下:
import { CaseType } from "../../type/type"
import router from '@ohos.router';
import {BasicCaseListRouter} from "../../router/index";
这部分代码导入了三个关键模块:
CaseType
:自定义的案例类型接口,定义了案例数据的结构router
:HarmonyOS提供的路由服务,用于页面跳转BasicCaseListRouter
:预定义的案例列表数据,包含该阶段的所有案例
3. 组件声明
@Entry
@Component
struct Stage1List {
// 基础入门阶段案例数据
caseList:CaseType[] = BasicCaseListRouter
build() {
// UI构建代码
}
}
@Entry
:标记此组件为页面入口@Component
:声明这是一个UI组件caseList
:组件的状态变量,类型为CaseType[]
,初始值为对应的路由配置数据
三、UI结构实现
1. 整体布局
所有三个页面都采用了相似的布局结构:
Stack() {
// 背景层
Column()
.width('100%')
.height('100%')
.backgroundColor('#F0F5FF') // 淡蓝色背景
.justifyContent(FlexAlign.Center)
// 内容层
Column({ space: 30 }) {
// 返回按钮、标题和列表内容
}
.alignItems(HorizontalAlign.Center)
.justifyContent(FlexAlign.Center)
.height('100%')
.width('100%')
}
页面使用Stack
组件作为根容器,实现了层叠布局:
- 第一层:全屏淡蓝色背景
- 第二层:主内容区,包含返回按钮、标题和案例列表
2. 返回按钮设计
// 返回按钮
Row() {
Button('← 返回')
.fontSize(16)
.foregroundColor('#f5f5f5')
.padding({ left: 16, right: 16, top: 8, bottom: 8 })
.borderRadius(8)
.onClick(() => {
router.back();
})
}
.margin({ right: 32 })
.alignItems(VerticalAlign.Bottom)
.justifyContent(FlexAlign.End)
.width('92%')
返回按钮的设计特点:
- 使用
Row
容器并设置右对齐,使按钮位于页面右上角 - 按钮文本包含左箭头符号,增强可识别性
- 点击事件使用
router.back()
实现返回上一页功能 - 统一的样式:浅色文本、圆角边框、适当的内边距
3. 标题设计
三个页面的标题各不相同,反映了不同的学习阶段:
// BasicCaseList.ets
Text('萌新小白开始闯关')
// AdvancedCaseList.ets
Text('闯荡江湖牛刀小试')
// HybridCaseList.ets
Text('江湖大佬高山仰止')
标题样式统一:
.fontSize(28)
.fontWeight(700)
.foregroundColor('#262626')
.margin({ top: 10 })
.textAlign(TextAlign.Center)
4. 案例列表实现
// 案例列表
List() {
ForEach(this.caseList, (item:CaseType, index) => {
ListItem() {
Column({ space: 16 }) {
Text(item.caseName)
.fontSize(20)
.fontWeight(600)
.foregroundColor('#262626')
Text(item.desc)
.fontSize(16)
.foregroundColor('#8C8C8C')
}
.padding(28)
.backgroundColor('white')
.borderRadius(20)
.width('300vp')
.alignItems(HorizontalAlign.Center)
.align(Alignment.Center)
.justifyContent(FlexAlign.Center)
.onClick(() => {
router.pushUrl({ url: item.articlePath });
})
}.margin({top:16})
.align(Alignment.Center)
.width('100%')
}, (item:CaseType) => item.caseName)
}
.width('100%')
.height('80%')
.margin({ top: 10, bottom: 10 })
列表实现的关键点:
- 使用
List
和ForEach
组合渲染案例列表 - 每个案例项使用
Column
布局,包含案例名称和描述两个Text
组件 - 案例项样式:白色背景、圆角边框(20)、固定宽度(300vp)、居中对齐
- 点击事件使用
router.pushUrl
跳转到案例详情页,传入articlePath
作为目标路径 - 使用
item.caseName
作为列表项的唯一键值,优化渲染性能
四、数据流分析
1. 数据结构
// CaseType接口定义
export interface CaseType {
caseName: string; // 案例名称
desc: string; // 案例描述
articlePath: string; // 博文页面路由路径
}
CaseType
接口定义了案例数据的结构,包含三个字段:
caseName
:案例名称,显示为列表项的标题desc
:案例描述,显示为列表项的副标题articlePath
:案例详情页的路由路径,用于页面跳转
2. 数据来源
每个页面的数据来自对应的路由配置:
// BasicCaseList.ets
caseList:CaseType[] = BasicCaseListRouter
// AdvancedCaseList.ets
caseList:CaseType[] = AdvancedCaseListRouter
// HybridCaseList.ets
caseList:CaseType[] = HybridCaseListRouter
路由配置在router/index.ets
文件中定义:
export const BasicCaseListRouter:CaseType[] = [
{
caseName: '演示数据',
desc: '演示数据随着项目需求而改变',
articlePath: "Components/TestCase"
},
// 更多案例...
];
3. 数据流向
数据流向可以概括为:
- 路由配置文件定义案例数据
- 页面组件导入并存储数据
- UI组件通过
ForEach
渲染数据 - 用户点击触发路由跳转,将
articlePath
传递给路由系统
五、页面导航实现
1. 返回导航
Button('← 返回')
// 样式属性...
.onClick(() => {
router.back();
})
返回导航使用router.back()
方法,将用户带回上一页(首页)。
2. 前进导航
.onClick(() => {
router.pushUrl({ url: item.articlePath });
})
前进导航使用router.pushUrl
方法,将用户带到案例详情页。这种方式会将当前页面保留在导航栈中,用户可以通过返回按钮回到案例列表页。
六、总结
二级页面的设计,也是主要是通过一级页面的分流, 来更加清晰的进行归类, 其实这里的设计,如果设计成Tabs 可能会更好些吧, 嗨主要是知识学习,至于UI将就着看吧
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。