05.1
为什么需要架构
架构让人改得动:可测试、可复用、可并行开发。鸿蒙推荐 UI 层 → 领域层 → 数据层 分层,UI 只渲染状态。
没有银弹
小项目组件内聚即可;状态与交互复杂时再引入 ViewModel/Repository,避免过度设计。
05.2
Stage 模型
Stage 是 NEXT 的默认应用模型:UIAbility 承载界面与生命周期,WindowStage 管理窗口,更利于多窗口与后台。
export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: window.WindowStage) {
windowStage.loadContent('pages/Index')
}
}05.3
MVVM
ViewModel 持有状态与业务逻辑,UI 通过 @State/@Link 或自定义状态持有者观察,事件回传 VM。
class LoginVM {
@State userName: string = ""
@State loading: boolean = false
login() { this.loading = true /* 调 repo */ }
}
// 组件持有 VM 实例,绑定状态VM 与 UI 解耦
VM 不依赖 UI 组件,可在无界面下做单元测试:直接调用方法、断言状态。
05.4
状态管理
AppStorage 是应用级全局单例状态,LocalStorage 是页面级;跨组件共享用 @StorageLink/@StorageProp。
AppStorage.setOrCreate('theme', 'dark')
// 组件中
@StorageLink('theme') theme: string = 'light'05.5
Repository 模式
Repository 统一数据来源(网络+本地),对外暴露领域模型,UI/VM 不关心数据来自哪里。
05.6
依赖组织
用单例或工厂集中创建数据/服务实例,避免在组件里散落 new,便于替换与测试。
export class ServiceLocator {
static userRepo: UserRepository = new UserRepository()
}05.7
模块拆分
用 HAR/HSP 模块按特性(:feature:home、:library:network)拆分,控制耦合、提升复用与编译速度。
依赖方向向下
上层依赖下层,下层不反向引用上层,否则循环依赖且无法单独测试。
05.8
常见陷阱
逻辑绑在组件生命周期里,无法脱离 UI 测。抽到 ViewModel/Repository,组件只触发调用、观察状态。
全局状态满天飞会导致隐式耦合与难以追踪的刷新。仅在真正跨页面共享时使用,局部用 @State。
05.9