鸿蒙面试题系列(一):从状态管理到性能优化,这7个核心考点你掌握了没?
在鸿蒙原生应用(HarmonyOS NEXT)的开发浪潮中,ArkTS 语言和 ArkUI 框架凭借其声明式 UI 和强大的状态管理机制,成为了开发者们的新宠。然而,在实际项目开发和面试过程中,我们经常会遇到一些高频的核心技术问题。
本文作为系列开篇,将围绕鸿蒙开发中常见的 7 个核心知识点进行深度剖析,涵盖装饰器、包管理、列表渲染、组件通信及状态存储等关键领域,帮助大家巩固记忆。
1. 常用的装饰器有哪些?
在 ArkTS 的声明式 UI 框架中,装饰器(Decorator)是实现组件状态管理和生命周期控制的核心语法。常用的装饰器主要分为以下几类:
组件状态装饰器:用于管理组件的内部状态。
@State:组件内部私有状态,状态的改变会触发 UI 刷新。@Prop:父子组件单向数据传递,父组件数据变化会同步给子组件,但子组件不能修改父组件数据。@Link:父子组件双向数据绑定,父子组件任何一方修改数据都会同步给对方。@ObjectLink:用于嵌套对象类型的双向绑定。
全局状态装饰器:
@StorageProp/@StorageLink:与 AppStorage 关联,实现全局状态的单向或双向绑定。
组件元数据装饰器:
@Entry:标记页面的入口组件。@Component:标记自定义组件。@Preview:在开发工具中预览组件效果。
2. HAP、HSP、HAR 的区别?
在鸿蒙应用工程中,这三种文件类型代表了不同的模块化和打包方式 :
HAP (Harmony Ability Package):
定义:鸿蒙应用安装和运行的基本单元。
特点:包含代码、资源、第三方库及配置文件,支持声明 Ability 和 Page。
分类:分为
Entry(主模块,应用入口)和Feature(特性模块,支持按需下载安装)。
HAR (Harmony Archive):
定义:静态共享包。
特点:主要用于编译时复用。代码和资源会跟随使用方编译,如果存在多个使用方,会存在多份相同的拷贝。
适用:作为二方库或三方库(如工具类库、UI 组件库)发布供其他应用依赖。
HSP (Harmony Shared Package):
定义:动态共享包。
特点:主要用于运行时复用。多个 HAP 可以共享同一份代码和资源,运行时进程中只存在一份,能有效减少应用包体积。
适用:多模块共用的代码和资源,以及需要运行时动态加载的场景。
3. 什么时候用 HSP 包?什么时候用 HAR 包?
选择 HSP 还是 HAR,主要取决于复用时机和包体积优化的需求 :
推荐使用 HAR 的场景:
需要发布给其他应用使用的公共 SDK 或工具库。
项目中模块较少,引用关系简单,对包体积增长不敏感。
对应用启动性能要求较高,希望减少运行时的加载开销。
推荐使用 HSP 的场景:
大型应用内部,有多个 Feature 模块或 Entry 模块需要共享同一份代码(如公共基础能力层、共享的业务逻辑)。
需要严格控制应用的总包体积,避免在编译时被多次打包相同代码。
需要支持运行时动态加载某些通用模块。
4. 为什么要用 LazyForEach?LazyForEach 怎么用?
为什么要使用 LazyForEach?
在处理长列表数据时,如果使用普通的
ForEach,框架会一次性渲染所有的列表项,这会消耗大量的内存和 CPU 资源,导致页面卡顿甚至崩溃。而LazyForEach实现了数据懒加载,它只会渲染当前屏幕可视区域内的列表项以及少量的缓存项。当列表项滑出可视区域时,框架会销毁并回收这些组件,从而大幅降低内存占用,支持万级数据的流畅滚动 。LazyForEach 怎么用?
LazyForEach必须配合特定的容器组件(如List、Grid、Swiper)使用 。数据源:必须实现
IDataSource接口,以便监听数据的变化。键值生成器 (keyGenerator):必须提供一个唯一且持久的键值生成函数。框架依靠这个 key 来判断哪些组件可以复用、哪些需要重新创建。强烈建议使用数据本身的唯一 ID 作为 key,而不是数组的索引
index,否则在数据增删时会导致大量的无效重建和 UI 错乱 。
5. @Prop 和 @Link 区别?
这两个装饰器都是用于父子组件之间的数据通信,核心区别在于数据流向 :
@Prop (单向绑定):
数据流:父组件 -> 子组件。
特性:子组件接收父组件传递的数据后,默认是只读的(不能修改)。如果子组件强行修改,可能会导致数据不同步。
使用场景:子组件只需要展示数据,不需要修改数据(如商品卡片、用户头像展示等)。
传值方式:父组件传递普通变量值
{ title: this.title }。
@Link (双向绑定):
数据流:父组件 <-> 子组件。
特性:父子组件共享同一份数据引用。任何一方修改数据,另一方都会同步更新。
使用场景:需要表单交互的场景,如父子组件中的开关按钮、计数器数值同步等。
传值方式:父组件必须传递引用,变量前加
$符号{ count: $count }。
6. Text 组件中能不能加标签?
能,但只能嵌套Span组件。
在鸿蒙的 ArkUI 框架中,Text组件主要用于展示文本。如果需要在一行文本中对某一部分文字设置不同的样式(如颜色、字号、加粗)或者添加点击事件,可以通过在Text内部嵌套Span组件来实现 。
需要注意的是,Span是行内文本组件,它不能嵌套块级组件。Span未显式设置的样式属性(如字体颜色、大小)会自动继承父Text组件的样式 。
7. LocalStorage 和 AppStorage 区别?
这两者都是鸿蒙提供的轻量级状态管理工具,但它们的作用范围和生命周期截然不同 :
AppStorage:
作用范围:应用全局状态。在整个应用的所有页面、所有 Ability 实例之间共享数据。
生命周期:跟随应用进程,应用退出后数据清空(除非结合持久化存储使用)。
适用场景:登录状态、用户信息、全局主题色、应用配置等需要全局共享的数据。
LocalStorage:
作用范围:页面级或 UIAbility 内状态。主要用于在特定页面或特定的 UIAbility 内部共享状态。
生命周期:跟随页面或 UIAbility,页面/Ability 销毁时数据自动释放。
适用场景:当前页面的分页参数、弹窗的显隐状态、页面临时缓存数据等。
以上就是对这 7 个鸿蒙核心知识点的详细解析。掌握这些基础概念不仅是应对面试的法宝,更是写出高性能、易维护鸿蒙原生应用的关键。希望大家在实际开发中多多实践,融会贯通!