第十五天 学习并实践HarmonyOS应用的基本结构、页面导航和状态管理

HarmonyOS应用开发入门:从基本结构到状态管理实战指南

前言

(约300字,说明HarmonyOS的发展前景,应用开发的市场需求,以及本教程的核心价值。强调手把手教学特点,降低学习门槛)


一、HarmonyOS应用基本结构解析

1.1 项目目录结构详解

bash 复制代码
MyFirstApp/
├── AppScope/           # 全局资源
│   ├── resources/
│   └── app.json5      # 应用配置
├── entry/              # 主模块
│   ├── src/main/
│   │   ├── ets/       # 业务代码
│   │   ├── resources/ # 模块资源
│   │   └── module.json5
└── features/          # 可选功能模块

对比传统Android项目结构,突出AppScope的全局资源管理特性,解释entry模块的入口意义

1.2 Ability的核心作用

typescript 复制代码
// EntryAbility.ts
export default class EntryAbility extends Ability {
    onCreate() {
        // 初始化操作
    }
    
    onWindowStageCreate(windowStage: window.WindowStage) {
        // 加载首页
        windowStage.loadContent("pages/IndexPage", (err) => {
            if (err.code) {
                // 错误处理
            }
        });
    }
}

通过实际代码演示Ability生命周期,重点说明WindowStage与页面加载的关系

1.3 页面文件组织结构

bash 复制代码
pages/
├── IndexPage.ets     # 页面逻辑
├── IndexPage.css     # 样式文件
└── IndexPage.json    # 页面配置

结合MVVM模式讲解三者协同工作原理,演示数据绑定的基础实现


二、页面导航实战演练

(核心功能模块,约1000字)

2.1 路由配置基础

json5 复制代码
// module.json5
"pages": [
    "pages/IndexPage",
    "pages/DetailPage"
]

强调路由注册的重要性,演示动态路由注册的进阶用法

2.2 页面跳转六种方式

typescript 复制代码
// 基础跳转
router.pushUrl({
    url: "pages/DetailPage"
})

// 带参跳转
router.pushUrl({
    url: "pages/DetailPage?itemId=123"
})

// 带回调跳转
router.pushUrl({
    url: "pages/DetailPage"
}).then(() => {
    // 跳转成功处理
})

每种方式配合实际应用场景说明(电商商品详情跳转、表单提交跳转等)

2.3 导航栏开发实战

typescript 复制代码
// 自定义导航栏
@Entry
@Component
struct NavDemo {
    @State currentIndex: number = 0

    build() {
        Column() {
            // 导航按钮
            Row() {
                Button('首页').onClick(() => this.switchTab(0))
                Button('我的').onClick(() => this.switchTab(1))
            }

            // 内容区域
            Swiper() {
                HomePage()
                MinePage()
            }
        }
    }

    private switchTab(index: number) {
        this.currentIndex = index
    }
}

完整实现带滑动效果的Tab导航,包含状态联动与动画优化


三、状态管理深度解析

3.1 状态管理全景图

graph TD A[状态类型] --> B[页面级状态] A --> C[应用级状态] B --> D[@State] C --> E[AppStorage] C --> F[LocalStorage]

通过图示清晰划分状态管理层次,说明各方案的适用场景

3.2 页面级状态实战

typescript 复制代码
@Entry
@Component
struct CounterPage {
    @State count: number = 0

    build() {
        Column() {
            Text(`点击次数: ${this.count}`)
                .fontSize(20)
            
            Button("增加")
                .onClick(() => {
                    this.count++
                })
        }
    }
}

扩展实现双向绑定、状态监听等进阶功能

3.3 全局状态管理方案

typescript 复制代码
// 定义全局状态
AppStorage.SetOrCreate<number>('globalCount', 0)

// 在组件中使用
@Component
struct GlobalCounter {
    @StorageLink('globalCount') count: number

    build() {
        Button(`全局计数: ${this.count}`)
            .onClick(() => this.count++)
    }
}

对比LocalStorage与AppStorage的差异,演示跨页面状态同步

3.4 状态持久化实践

typescript 复制代码
// 使用Preferences存储
import preferences from '@ohos.data.preferences'

async function saveData(key: string, value: preferences.ValueType) {
    const pref = await preferences.getPreferences(this.context)
    await pref.put(key, value)
    await pref.flush()
}

结合本地存储实现状态持久化,确保应用重启后数据不丢失


四、综合项目实战:TODO应用

  1. 项目功能规划:添加任务、分类展示、状态切换
  2. 技术点整合:
    • 使用@State管理任务列表
    • 通过路由实现详情页跳转
    • 应用AppStorage实现主题切换
  3. 关键代码片段展示:
typescript 复制代码
@Entry
@Component
struct TodoApp {
    @StorageLink('theme') currentTheme: string = 'light'
    @State todos: TodoItem[] = []

    build() {
        Column() {
            ThemeSwitcher()
            TodoList()
            AddButton()
        }
    }
}

五、调试与优化技巧

(约300字,提升内容实用价值)

  1. 开发者模式开启指南
  2. 常用调试命令:
bash 复制代码
hdc shell 
bm get -u
  1. 性能优化建议:减少不必要的状态更新、合理使用组件复用
相关推荐
三品吉他手会点灯11 分钟前
STM32F103学习笔记-16-RCC(第4节)-使用 HSI 配置系统时钟并用 MCO 监控系统时钟
笔记·stm32·单片机·嵌入式硬件·学习
Lester_110134 分钟前
嵌入式学习笔记 - 关于看门狗定时器的喂狗的操作放在中断还是放在主循环
笔记·单片机·学习
缪懿1 小时前
JavaEE:多线程基础,多线程的创建和用法
java·开发语言·学习·java-ee
AA陈超2 小时前
ASC学习笔记0017:返回此能力系统组件的所有属性列表
c++·笔记·学习·ue5·虚幻引擎
夏文强3 小时前
HarmonyOS开发者认证练习题-判断题
华为·harmonyos
Kisang.3 小时前
【HarmonyOS】ArkTS的多线程并发(下)——线程间通信对象的传递
华为·typescript·harmonyos·鸿蒙
小呀小萝卜儿3 小时前
2025-11-15 学习记录--Python-LSTM模型定义(PyTorch)
python·学习·lstm
XDHCOM3 小时前
通过手机远程操控电脑,一步步学习便捷方法
学习·智能手机·电脑
胡楚昊4 小时前
Polar MISC(下)
学习
程序员东岸4 小时前
从零开始学二叉树(上):树的初识 —— 从文件系统到树的基本概念
数据结构·经验分享·笔记·学习·算法