承接前两期的布局与样式,当我们把目光从“页面怎么画”转移到“应用怎么搭”时,架构设计与底层原理就成了区分初级与中高级开发者的分水岭。

17. 组件间传值(通讯)的方式有哪些?

在 ArkTS 的声明式范式中,数据流向通常是“自上而下”的单向流动,但在复杂场景下也需要双向绑定或全局共享:

  1. 父子组件传值(Props)

    • @Prop:父传子,子组件修改不影响父组件(单向)。

    • @Link:父子双向绑定,子组件修改父组件同步更新(需用 $符号传参)。

    • @Propvs @Link:如果子组件只是展示或局部修改,用 @Prop;如果需要联动父级状态(如开关切换),用 @Link

  2. 跨组件/页面传值(全局状态管理)

    • AppStorage:应用全局状态,类似全局变量,常用于用户登录态、主题模式等全应用共享的数据。

    • LocalStorage:页面级或组件级的状态共享,常用于页面跳转时的参数传递或页面内部的模块间通信。

    • Emitter:事件发射器,适用于完全不相关的两个组件之间进行解耦通信(发布/订阅模式)。

  3. 深浅拷贝传递

    • 对于简单数据直接传递;对于复杂对象,若要避免子组件意外修改影响父组件,建议使用深拷贝(JSON.parse(JSON.stringify(obj)))或 @Observed/@ObjectLink

18/19. 组件与页面的生命周期

理解生命周期有助于我们在合适的时机进行数据初始化和资源释放。

  • 页面生命周期(Page)

    • aboutToAppear:页面即将显示时触发。关键点:此时页面 UI 还未构建,适合在此处进行数据拉取(防止页面白屏)。

    • onPageShow:页面显示后触发,适合做埋点统计或恢复动画。

    • onPageHide/ onBackPress:页面隐藏或点击返回键时触发,适合做数据保存或拦截返回操作。

  • 组件生命周期(Component)

    • aboutToRender:自定义组件即将渲染时触发(API 11+),适合在此预计算一些复杂的 UI 状态。

    • aboutToDisappear:组件即将销毁时触发,适合清理定时器或取消网络请求。

20. Ability 的生命周期(系统级)

Ability 是鸿蒙应用的基本组成单元,其生命周期由系统管理,反映了应用从启动到销毁的全过程:

  1. onCreate:Ability 实例创建,全局初始化(如读取配置)。

  2. onWindowStageCreate:窗口 Stage 创建,此时可以设置页面路径(通常为 windowStage.loadContent)。

  3. onForeground:应用切换到前台,此时应恢复播放视频、刷新数据。

  4. onBackground:应用切换到后台,此时应暂停耗时操作、释放内存。

  5. onWindowStageDestroy​ & onDestroy:Ability 彻底销毁,清理所有残留资源。

21. 什么是泛型?泛型的作用?

泛型(Generics)允许我们在定义函数、接口时,不预先指定具体类型,而在使用时再指定。

  • 作用 1:代码复用。例如封装一个通用的网络请求工具 request<T>,传入 User类型就返回 User,无需为每种数据写一遍逻辑。

  • 作用 2:类型安全。在编译期进行类型检查,避免了 JavaScript 中频繁的 any类型转换导致的运行时错误。

22. 装饰器全家桶(@Observed/@ObjectLink/@Watch/@Builder/@BuilderParam)
  • @Observed& @ObjectLink:解决嵌套对象的响应式问题。普通的 @State无法观察到对象内部属性的变化。用 @Observed修饰类,@ObjectLink在子组件中接收,即可实现深层属性的双向绑定。

  • @Watch:状态监听器。给变量加上 @Watch('onChange'),当变量变化时自动触发自定义函数,适合做防抖或联动计算。

  • @Builder& @BuilderParam:UI 复用的终极方案。@Builder用于抽取重复 UI 结构;@BuilderParam允许父组件向子组件的 @Builder中传入自定义内容,实现高度灵活的组件封装(如自定义弹窗头部)。

23. @Prop 和 @Link 的作用和区别
  • @Prop单向绑定。父组件的数据传给子组件,子组件可以修改自己的拷贝,但修改不会同步回父组件。

  • @Link双向绑定。子组件的修改会直接修改父组件的状态。它必须在创建时传入 $变量名(带 $符号)。

  • 避坑指南:切忌在子组件中直接用 @Link绑定一个基本类型(如 string/number)。因为双向绑定意味着父子指向同一块内存,对于基本类型是引用赋值,极易导致状态混乱。

24. 首选项(Preferences)和 PersistentStorage 的区别
  • Preferences:类似于前端的 localStorage。它是一个键值对(KV)存储,适合存用户的设置项(如音量、字体大小)。它是异步 API。

  • PersistentStorage:这是 HarmonyOS 3.0+ 推出的持久化状态管理装饰器。它结合了 AppStorage和底层持久化能力。用法:@StorageLink('key') varName: number = 0。你只需要像操作普通变量一样操作它,系统会自动帮你存盘和读盘,且支持响应式更新。


25. 什么是三层架构?有哪三层?每层的作用是什么?

在鸿蒙应用开发中,为了应对复杂的业务需求并实现多端复用,通常采用以下三层架构(自顶向下):

1. 产品定制层(Product Customization Layer)

  • 定位:应用的入口,面向特定设备(如手机、折叠屏、车机)或特定场景(如标准版、海外版)。

  • 职责:专注于 UI 设计、资源配置和特定场景的交互逻辑。它不包含核心算法,而是组装下层提供的能力。

  • 依赖关系:依赖基础特性层和公共能力层来实现具体功能。

2. 基础特性层(Feature Layer)

  • 定位:位于公共能力层之上,是相对独立的业务功能集合。

  • 职责:每个模块(如购物车、个人中心)都具备高内聚、低耦合的特点。它为产品定制层提供具体的业务 UI 和逻辑支持。

  • 典型实践:应用底部导航栏的每个选项都是一个独立的业务模块,对应基础特性层中的一个 Feature。

3. 公共能力层(Common Capability Layer)

  • 定位:应用的基石,存放所有共享的基础能力。

  • 职责

    • 公共 UI 组件:通用的按钮、弹窗、列表等。

    • 数据管理:网络请求封装、数据库操作(RDB)、数据缓存。

    • 外部交互:设备 I/O、文件操作、权限管理等。

    • 工具库:日期处理、字符串加密、日志打印等。

架构优势:通过这种分层,可以实现业务逻辑与 UI 表现的解耦。当更换设备形态时,只需修改产品定制层,基础特性和公共能力层可以完全复用,极大提升了开发效率。

26. 什么样的项目用单层架构,什么样的项目用多层架构?

单层架构(Monolithic)

  • 适用场景:工具类应用、单页面 Demo、简单的静态页面展示。

  • 特点:所有代码(UI、逻辑、网络)混杂在一个文件中。

  • 优缺点:开发速度快,代码量小;但难以维护,无法复用,无法应对复杂交互。

多层架构(Layered)

  • 适用场景:企业级应用、大型商业 App(如电商、社交、金融)、需要适配多设备的项目。

  • 特点:严格划分职责,单向依赖。

  • 优缺点:代码结构清晰,利于团队协作(前端写 UI,后端写逻辑),便于单元测试和后期维护。虽然初期搭建成本较高,但长期收益巨大。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐