鸿蒙面试通关指南(第三期):架构、状态管理与底层原理
承接前两期的布局与样式,当我们把目光从“页面怎么画”转移到“应用怎么搭”时,架构设计与底层原理就成了区分初级与中高级开发者的分水岭。
17. 组件间传值(通讯)的方式有哪些?
在 ArkTS 的声明式范式中,数据流向通常是“自上而下”的单向流动,但在复杂场景下也需要双向绑定或全局共享:
-
父子组件传值(Props):
-
@Prop:父传子,子组件修改不影响父组件(单向)。 -
@Link:父子双向绑定,子组件修改父组件同步更新(需用$符号传参)。 -
@Propvs@Link:如果子组件只是展示或局部修改,用@Prop;如果需要联动父级状态(如开关切换),用@Link。
-
-
跨组件/页面传值(全局状态管理):
-
AppStorage:应用全局状态,类似全局变量,常用于用户登录态、主题模式等全应用共享的数据。
-
LocalStorage:页面级或组件级的状态共享,常用于页面跳转时的参数传递或页面内部的模块间通信。
-
Emitter:事件发射器,适用于完全不相关的两个组件之间进行解耦通信(发布/订阅模式)。
-
-
深浅拷贝传递:
-
对于简单数据直接传递;对于复杂对象,若要避免子组件意外修改影响父组件,建议使用深拷贝(
JSON.parse(JSON.stringify(obj)))或@Observed/@ObjectLink。
-
18/19. 组件与页面的生命周期
理解生命周期有助于我们在合适的时机进行数据初始化和资源释放。
-
页面生命周期(Page):
-
aboutToAppear:页面即将显示时触发。关键点:此时页面 UI 还未构建,适合在此处进行数据拉取(防止页面白屏)。 -
onPageShow:页面显示后触发,适合做埋点统计或恢复动画。 -
onPageHide/onBackPress:页面隐藏或点击返回键时触发,适合做数据保存或拦截返回操作。
-
-
组件生命周期(Component):
-
aboutToRender:自定义组件即将渲染时触发(API 11+),适合在此预计算一些复杂的 UI 状态。 -
aboutToDisappear:组件即将销毁时触发,适合清理定时器或取消网络请求。
-
20. Ability 的生命周期(系统级)
Ability 是鸿蒙应用的基本组成单元,其生命周期由系统管理,反映了应用从启动到销毁的全过程:
-
onCreate:Ability 实例创建,全局初始化(如读取配置)。 -
onWindowStageCreate:窗口 Stage 创建,此时可以设置页面路径(通常为windowStage.loadContent)。 -
onForeground:应用切换到前台,此时应恢复播放视频、刷新数据。 -
onBackground:应用切换到后台,此时应暂停耗时操作、释放内存。 -
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,后端写逻辑),便于单元测试和后期维护。虽然初期搭建成本较高,但长期收益巨大。
更多推荐


所有评论(0)