> 技术文档 > 鸿蒙经典面试题_鸿蒙arkts 面试题

鸿蒙经典面试题_鸿蒙arkts 面试题

  1. ArkTS和TS有什么区别
    ArkTS 在很大程度上借鉴了 TS 的语法,并且延用了诸多 ES6 的方法和属性。像常用的
    Object.keys,还有字符串以及数组相关的方法等都有所延用。
    然而,ArkTS 有着更为严苛的规范:
    a. 在动态类型方面,它几乎进行了全面禁止。例如解构赋值在 ArkTS 中是被禁用的;
    b. 延展运算符只能应用于数组,不能用于其他场景;
    c. 禁止使用 call/apply/bind 这些方法来改变 this 的指向;
    d. 字面量类型在 ArkTS 中也无法使用;
    e. any 和 unknown 类型同样被禁用。
    f. 要求必须明确声明一些数据的类型,比如用 State 修饰的变量就需要明确其类型。
    总的来说,ArkTS 虽然借鉴了 TS 的一些优势之处,但出于对性能的考虑,屏蔽了 TS 在类型方面可能带来的一些短板,它在继承与创新中找到了一个独特的平衡点,以满足鸿蒙系统开发等场景下对于高效、稳定、安全编程的要求。

  2. ArkUI的核心设计思想是什么
    ● 声明式开发
    ○ ArkUI采用声明式UI范式,通过状态驱动视图更新(如React/Vue)。
    ● 跨平台能力
    ○ 一套代码能跑手机、平板、手表、电视等设备。
    ○ 通过自适应布局,自动适配不同屏幕大小,开发者不用为每个设备单独写布局代码。
    ● 用户体验优先
    ○ 优化渲染引擎让界面滑动更流畅,提供统一的设计规范组件库(比如按钮、弹窗样
    式统一),保证多端体验一致。
    此外, 它支持 JavaScript/TS/Java 等多语言开发,还能自定义组件插件,方便扩展功能。

  3. 什么是线性布局
    ● 线性布局(LinearLayout)是开发中最常用的布局,通过线性容器 Row 和 Column 构建。
    ● Column容器内子元素按照垂直方向排列,Row容器内子元素按照水平方向排列。
    ● 根据不同的排列方向,开发者可选择使用Row或Column容器创建线性布局
    口语化表达:
    简单来说,它能让界面里的组件按照直线方向排列。这个方向有两种,要么水平排,要么垂直排。
    要是选水平方向,那组件就从左到右依次摆开;选垂直方向呢,组件就从上往下一个个排列。
    用线性布局的时候,你还能控制组件之间的间距、对齐方式啥的。比如说,让组件在水平方向上左对齐、居中对齐或者右对齐,垂直方向上也能这么操作。
    像做个简单的菜单,里面有一排按钮,用水平线性布局就挺合适;要是有个列表,一个挨着一个往下排,垂直线性布局就派上用场啦。

  4. 线性布局对齐方式
    ArkUI 线性布局的对齐方式主要分两类:
    ● 主轴对齐(沿排列方向)
    ○ start:默认,组件靠左(水平)或靠上(垂直)排列。
    ○ end:组件靠右 / 下排列。
    ○ center:组件居中排列。
    ○ space-between:两端对齐,中间间距均分。
    ○ space-around:每个组件左右 / 上下间距相等(两端留一半间距)。
    ● 交叉轴对齐(垂直方向)
    ○ start:顶部对齐(水平布局时)。
    ○ end:底部对齐。
    ○ center:垂直居中。
    ○ stretch:组件拉伸填满交叉轴空间(默认)。
    例子:水平布局下,justifyContent: space-between会让按钮左一个右一个,中间自动留白;alignItems: center会让所有按钮垂直居中。

  5. 什么是弹性布局
    ● 弹性布局分为单行布局和多行布局。
    ○ 默认情况下,Flex 容器中的子元素都排在一条线(又称“轴线”)上。
    ○ 子元素尺寸总和大于 Flex 容器尺寸时,子元素尺寸会自动挤压。
    ○ 支持主轴对齐(justifyContent)和交叉轴对齐(alignItems),比如让按钮在容器
    居中或两端对齐。
    ● 例子:一个商品列表,标题和价格用弹性布局,标题会自动占据剩余空间,价格固定
    宽度,整体自适应屏幕大小。

  6. Flex布局用过哪些装饰器,分别介绍一下
    ● 简单排列选 Column/Row
    如果只是单纯的一行排开(Row)或一列堆叠(Column),用 Column/Row 更简单。比如做个水平导航栏,直接用 Row 设置间距就行,代码量少。
    ● 复杂布局用 Flex
    需要弹性分配空间时(如让某个组件撑满剩余宽度),或者需要灵活控制对齐方式(如两端对齐、自动换行),Flex 布局更合适。比如商品列表里的价格和描述,价格固定宽度,描述用 flexGrow:1 自动扩展。
    ● 性能与习惯考量
    ○ Column/Row 本质是线性布局,渲染性能略优,但差异不大。
    ○ 如果团队熟悉传统布局方式,Column/Row 更易上手;如果习惯 Web 的 Flexbox,
    直接用 Flex 布局更顺手。
    ● 例子:
    ○ 简单的垂直列表 → Column
    ○ 自适应宽度的按钮组 → Flex(加 flexWrap: wrap 实现换行)

  7. 什么是层叠布局(堆叠)
    ● 层叠布局通过 Stack 容器组件实现位置的固定定位与层叠,容器中的子元素依次入栈,后一个子元素覆盖前一个子元素,子元素可以叠加,也可以设置位置.
    ● 通过 alignContent 来设置子组件的位置
    ● 常用于需要视觉覆盖的场景,例如:
    ○ 图片上叠加文字标签
    ○ 按钮右上角显示未读消息红点
    ○ 弹窗浮层覆盖背景

  8. ArkUI中常用的容器组件
    Column / Row / Flex / Stack / List / Grid / Swiper / Tabs / Popup

  9. @Extend、@Styles、@Builder 区别

  10. 网格布局 Grid/GridItem
    ● 在 ArkUI 里,网格布局由Grid和GridItem配合使用,能将界面元素按二维网格列
    ● Grid是用来创建网格布局的容器,它可以定义网格的整体结构和属性。常用属性:
    ○ columns:设置网格的列数。例如设置为 3,就会将网格布局划分为 3 列。
    ○ spacing:指定网格项之间的间距,既可以是一个统一的值,也能分别设置水平
    /垂直间距。
    ○ rows:可设置网格的行数,不过通常可以根据子组件数量和列数自动计算。
    ○ direction:决定网格的排列方向,有水平(FlexDirection.Row)和垂直
    (FlexDirection.Column)两种。
    ● GridItem是Grid容器中的子组件,用于放置具体的内容,如文本、图片等。
    ○rowStart、rowEnd、columnStart、columnEnd:可以控制GridItem在网格中占据的
    行和列范围,实现跨越多个网格单元格的布局。

  11. 容器组件 Scroll
    Scroll组件可以将其内部的子组件包裹起来,当子组件的尺寸超出Scroll组件的可视区
    域时,用户能够通过滚动操作来查看完整内容,就像手机上浏览长文章或者商品列表那样。
    ● 常用属性:
    ○ scrollDirection:用于指定滚动方向,有水平(ScrollDirection.Horizontal)和垂直(ScrollDirection.Vertical)两种,默认是垂直方向。
    ○ scrollBar:控制滚动条的显示,可设置为显示(ScrollBar.On)或隐藏(ScrollBar.Off)。
    ○ friction:调节滚动时的摩擦力,影响滚动的顺滑程度。
    ● 应用场景:
    ○ 长文章阅读:新闻、小说等应用中,文章内容较长,使用Scroll组件能让用户流畅地滚动阅读。
    ○ 商品列表浏览:电商应用的商品展示列表,当商品数量较多时,可通过滚动查看更多商品。
    ○ 图片轮播:在一些图片展示场景中,水平滚动的Scroll组件可以实现图片的轮播效果。

  12. 容器组件Tabs
    ● 通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图。
    ● 组成属性
    ○ TabBar:包含多个Tab标签,用于显示每个标签页的标题,用户点击这些标签来切换内容。
    ○ TabContent:与每个Tab标签相对应,用于放置具体的内容,如文本、图片、列表等。
    ● 常用属性
    ○ selectedIndex:指定当前选中的标签页索引,从 0 开始计数。通过设置这个属性,可以控制默认显示的标签页,也可以在代码中动态改变它来切换标签页。
    ○ barPosition:设置TabBar的位置,有顶部(BarPosition.Top)和底部(BarPosition.Bottom)两种选择。
    ● 应用场景
    ○ 多功能应用:如社交应用,可能有消息、联系人、动态等多个功能模块,使用Tabs组件可以方便用户在这些模块之间切换。
    ○ 内容分类展示:在新闻应用中,可将不同类型的新闻(如时政、娱乐、体育等)以标签页的形式展示,用户可以快速切换查看不同类型的新闻。

  13. Badge组件
    ● 以附加在单个组件上用于信息标记(气泡)的容器组件.

14.如何设置组件的垂直水平居中

15.页面布局上的性能和内存上的注意事项
● 使用row/column+layoutweight代替flex容器使用
● scroll嵌套list/grid容器时,要设置容器的宽高,数组数据渲染尽量使用LazyForeach渲染item
● 组件的显隐设置,要使用if语句来判断,避免使用visibility
● list/grid容器要根据具体场景来使用cachecount,避免卡顿
具体业务场景:
电商 App 商品展示页
● 商品列表布局
○ 避免过度嵌套:商品列表通常使用 List 组件呈现。若在商品卡片内过度嵌套 Column、Row 等布局容器来展示商品信息(如标题、价格、图片等),会使渲染变慢。比如原本一个商品卡片用三层嵌套就能展示清楚,若写成五层嵌套,就会增加渲染负担。应尽量扁平化布局结构,把商品信息展示拆分成简单组件组合。
○ 合理使用布局容器:List 组件在处理大量商品数据时,本身具备懒加载特性,仅渲染当前可见区域的商品卡片。若不使用 List 而用 Column 逐个添加商品组件,会一次性加载所有商品信息,占用大量内存。
● 商品图片展示
○ 图片压缩:商品图片尺寸大,会导致加载缓慢且占用大量内存。比如一张高清商品图可能有几兆大小,应在上传前对图片进行压缩处理,同时根据不同设备分辨率提供不同尺寸图片。
○ 图片懒加载:商品列表中可能有很多图片,采用懒加载机制,当商品图片滚动到可视区域时再加载,能减少初始加载时的内存占用和网络请求。
社交 App 动态信息流页
● 动态内容布局
○ 减少不必要的组件创建:动态信息流中每条动态可能包含文本、图片、视频等内容。在使用 ForEach 渲染动态列表时,若每次数据更新都重新创建整个动态组件,会消耗大量资源。可通过设置 key 属性复用组件,如根据动态的唯一 ID 设置 key,ArkUI 就能识别哪些组件可复用。
○ 优化数据绑定:动态的点赞数、评论数等数据会实时更新,若将这些数据全部绑定到界面,频繁更新会触发界面重新渲染。可将部分数据(如点赞数)缓存起来,设置一个更新阈值,达到一定阈值再更新界面显示,减少不必要的渲染。
● 视频播放组件
○ 及时释放不再使用的组件:当用户滑动动态列表,视频组件滑出可视区域时,应及时释放视频资源,避免内存泄漏。可监听组件的显示状态,当不可见时停止视频播放并释放相关资源。
新闻资讯 App 新闻列表页
● 新闻条目布局
○ 避免过度嵌套:新闻条目通常包含标题、摘要、图片等信息。若用复杂的嵌套布局来展示这些内容,会影响渲染性能。可采用简单的 Column 和 Row 组合布局,将标题、摘要、图片等信息合理排列。
○ 合理使用布局容器:新闻列表使用 List 组件展示,若新闻有不同分类,可使用 Group 组件进行分组,避免使用过于复杂的布局容器。
● 广告展示
○ 避免过度响应式数据:广告部分可能会有一些动态展示内容,如倒计时、广告轮播等。对于一些静态的广告信息,如广告标题、描述等,使用普通变量存储,而不是响应式数据,减少内存开销。

16.列举常见的ArkTS装饰器及其作用。
● 组件级装饰器:
○ @State:组件内状态管理,数据变化触发UI刷新。
○ @Prop:单向同步父组件的状态,子组件修改不影响父组件。
○ @Link:与父组件双向同步,修改会同步到父组件。
○ @Provide/@Consume:跨层级组件状态同步,无需逐层传递。
● 应用级装饰器:
○ @StorageLink/@StorageProp:与AppStorage(应用级数据库)双向/单向同步。
○ @LocalStorageLink/@LocalStorageProp:与页面级LocalStorage同步。
17.在 ArkTS 中,如何处理组件间的通信
● 父传子
○ 使用 @Prop 装饰器。父组件将数据作为属性传递给子组件,子组件接收只读属性,父数据更新子组件同步更新。
● 子传父
○ @Link:双向数据绑定,子组件可修改父组件状态。
● 跨层级通信
○ 使用 @Provide 和 @Consume。祖先组件用 @Provide 提供数据,后代组件用 @Consume 消费。
18.值类型和引用类型的区别

  1. 是什么
    ● ArkTS中数据分为值类型(基本数据类型)和引用类型(复杂数据类型)
  2. 区别
    ● 存储位置不一样
    值类型的会保存在栈内存中
    引用类型的变量名(地址)会存在栈内存中,但是值会存储在堆内存中
    ● 赋值方式不一样
    值类型的直接赋值,赋的值本身
    引用类型赋值,赋的是地址(影响=>修改值会相互影响=>解决:浅拷贝或深拷贝)
    19.如何在ArkTS中实现应用级状态管理
    ● AppStorage:
    ○ 全局单例对象,用于跨页面、跨UIAbility的状态共享
    ○ 通过@StorageLink和@StorageProp实现双向/单向同步。
    ● LocalStorage
    ○ 页面级状态管理,适用于同一页面内多组件共享状态
    ○ 通过@LocalStorageLink和@LocalStorageProp绑定。
    20.@Watch装饰器的作用和使用场景
    ● 作用:监听状态变量变化,触发回调函数。
    ● 场景:
    ○ 数据变化时执行副作用(如日志记录、网络请求)。
    ○ 与@Link或@State配合,实现复杂状态逻辑(如购物车总价计算)。
    21、ArkTS中应用、页面、组件的生命周期有哪些
    ● 应用生命周期:
    a. onCreate:应用首次创建时触发,用于初始化全局资源(如读取系统配置)。
    b. onWindowStageCreate:窗口阶段创建时触发,通过loadContent加载页面(如设置首页)。
    c. onForeground:应用从后台切换到前台时触发,可重新申请资源(如恢复定位功能)。
    d. onBackground:应用进入后台时触发,需释放非必要资源(如停止后台服务)。
    e. onWindowStageDestroy:窗口阶段销毁时触发,释放UI相关资源(如关闭页面动画)。
    f. onDestroy:应用完全销毁前触发,用于保存数据或清理内存。

● 页面级生命周期(仅@Entry修饰的组件)
a. onPageShow:页面每次显示时触发(如路由跳转至该页面、应用回到前台)。
b. onPageHide:页面隐藏时触发(如跳转其他页面、应用进入后台)。
c. onBackPress:用户点击返回按钮时触发,返回true可自定义返回逻辑(如阻止页面关闭)。

● 页面级生命周期
a. aboutToAppear:组件实例创建后、build()执行前触发,适合初始化状态变量。
b. onDidBuild:build()完成后触发,可用于埋点统计(但禁止修改状态变量)。
c. aboutToDisappear:组件销毁前触发,需取消订阅事件或释放本地资源(如网络请求终止)。
想看更多的大厂的鸿蒙面试题,请点击下面的连接
最经典的100道鸿蒙面试题

子矜网开发