鸿蒙APP开发从入门到精通:ArkUI组件库详解与常用组件实战
鸿蒙(HarmonyOS NEXT)是华为推出的分布式操作系统,其APP开发框架以ArkUI为核心,采用ArkTS(基于TypeScript的扩展语言)进行声明式开发。这种范式类似于React/Vue,强调UI组件的组合和状态驱动。ArkUI组件库是构建鸿蒙APP UI的核心,提供丰富的内置组件,支持自定义和扩展。
本教程从入门到精通,基于HarmonyOS NEXT(2025-2026最新版),结合官方文档和开发者实践。假设你有JavaScript/TypeScript基础。代码可在DevEco Studio(华为官方IDE)中运行。安装DevEco Studio:从华为开发者官网下载,配置SDK(API Level 12+)。
目标:看完后,你能独立构建一个简单鸿蒙APP,并掌握ArkUI 90%的常用场景。
第一步:鸿蒙APP开发入门(快速上手)
1.1 环境搭建
- 下载DevEco Studio:官网(developer.harmonyos.com),支持Windows/macOS/Linux。
- 创建项目:New Project → Empty Ability → ArkTS(声明式)。
- 项目结构:
entry
├── ets // ArkTS源码
│ ├── entryability // 入口Ability
│ │ └── EntryAbility.ts
│ └── pages // 页面组件
│ └── Index.ets // 默认首页
├── resources // 资源文件(图片、字符串)
└── oh-package.json // 依赖配置
- 运行:连接真机/模拟器(需鸿蒙设备),点击Run。
1.2 ArkUI核心理念
- 声明式开发:用@Entry、@Component描述UI结构,非命令式(如Android View)。
- 组件树:UI由组件嵌套组成,支持状态管理(@State/@Prop)。
- 生命周期:build()渲染UI,aboutToAppear()初始化。
- ArkTS语法:类似TS,但添加装饰器如@Builder、@Extend。
入门代码(Index.ets):
import { Column, Text } from '@ohos.arkui';
@Entry
@Component
struct Index {
@State message: string = 'Hello, HarmonyOS!';
build() {
Column() {
Text(this.message)
.fontSize(24)
.fontColor(Color.Blue)
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
}
- 运行后:屏幕居中显示蓝色文本。
第二步:ArkUI组件库详解(分类与原理)
ArkUI组件库分为基础组件、容器组件、媒体组件、动画/交互组件等,共100+。基于声明式范式,组件是不可变的,状态变化触发重渲染。
2.1 组件分类速览表(2026主流)
| 分类 | 典型组件 | 作用与属性示例 | 扩展点 |
|---|---|---|---|
| 基础组件 | Text, Button, Image, TextInput | 显示/交互;属性:fontSize, onClick, src | @Extend 自定义样式 |
| 容器组件 | Column, Row, Stack, Flex, Grid | 布局子组件;属性:justifyContent, alignItems | 嵌套组合 |
| 列表/滚动 | List, GridList, Scroll, Swiper | 动态列表;属性:itemBuilder, direction | 数据绑定@ForEach |
| 媒体/高级 | Video, Web, Chart, Progress | 多媒体/图表;属性:controller, data | 事件监听 |
| 交互/动画 | Toggle, Radio, Slider, Animator | 表单/动画;属性:checked, value, transition | @Animate 动画 |
| 自定义 | @Component 结构体 | 复用逻辑;属性:@Prop, @State | 继承/组合 |
- 原理:ArkUI基于ArkCompiler编译为原生代码,高性能。组件支持响应式(@Watch状态监听)和数据绑定(@Link/@Provide)。
- 样式系统:链式属性设置(如.fontSize(24)),支持主题(@Styles)和媒体查询。
- 事件处理:onClick、onTouch等,支持冒泡/捕获。
2.2 关键特性
- 状态管理:@State(本地状态)、@Prop(父传子)、@Link(双向绑定)。
- 构建器:@Builder自定义渲染函数。
- 性能优化:LazyForEach懒加载列表,避免全渲染。
- 兼容性:支持鸿蒙API 10+,跨设备(手机/平板/手表)自适应。
第三步:常用组件实战(代码 + 解释)
下面挑选10大常用组件,每个提供实战代码(可复制到pages/NewPage.ets)。假设一个“Todo List” APP场景。
3.1 Text(文本组件)
- 作用:显示文本,支持富文本(Span)。
- 实战:动态欢迎语。
@Component
struct WelcomeText {
@Prop name: string;
build() {
Text(`欢迎, ${this.name}!`)
.fontSize(20)
.fontColor(Color.Green)
.backgroundColor(Color.LightGray)
.padding(10)
}
}
3.2 Button(按钮组件)
- 作用:点击交互,支持类型(Capsule/Normal)。
- 实战:提交按钮。
@Component
struct SubmitButton {
build() {
Button('提交')
.type(ButtonType.Capsule)
.backgroundColor(Color.Blue)
.onClick(() => {
prompt('提交成功!');
})
}
}
3.3 Image(图片组件)
- 作用:显示本地/网络图片,支持动画。
- 实战:头像显示。
Image($r('app.media.avatar')) // 本地资源
.width(100)
.height(100)
.borderRadius(50)
.objectFit(ImageFit.Cover)
3.4 TextInput/TextArea(输入组件)
- 作用:单行/多行输入,支持占位/验证。
- 实战:Todo输入框。
@State todo: string = '';
TextInput({ placeholder: '输入Todo' })
.onChange((value: string) => this.todo = value)
.margin(10)
3.5 Column/Row(线性布局)
- 作用:垂直/水平排列子组件。
- 实战:表单布局。
Column() {
Text('用户名')
TextInput()
Text('密码')
TextInput({ type: InputType.Password })
}
.width('100%')
.padding(20)
.space(10) // 子项间距
3.6 Stack(层叠布局)
- 作用:叠加子组件,如水印。
- 实战:带加载的图片。
Stack() {
Image('background.jpg')
Progress({ style: ProgressStyle.Circular })
.visible(true)
}
.align(Alignment.Center)
3.7 Flex(弹性布局)
- 作用:自适应排列,支持wrap。
- 实战:按钮组。
Flex({ direction: FlexDirection.Row, wrap: FlexWrap.Wrap }) {
Button('按钮1')
Button('按钮2')
Button('按钮3')
}
.justifyContent(FlexAlign.SpaceAround)
3.8 List/GridList(列表组件)
- 作用:滚动列表,支持分组/懒加载。
- 实战:Todo列表。
@State todos: string[] = ['买菜', '学习'];
List() {
ForEach(this.todos, (item: string) => {
ListItem() {
Text(item)
}
}, item => item)
}
.divider({ strokeWidth: 1 })
.onItemClick((index: number) => {
this.todos.splice(index, 1);
})
3.9 Swiper(轮播组件)
- 作用:滑动轮播,如banner。
- 实战:图片轮播。
Swiper() {
Image('img1.jpg')
Image('img2.jpg')
Image('img3.jpg')
}
.autoPlay(true)
.interval(3000)
.indicator(true)
3.10 Toggle/Radio(开关/单选)
- 作用:布尔/选项选择。
- 实战:主题切换。
@State isDark: boolean = false;
Toggle({ type: ToggleType.Switch, isOn: this.isDark })
.onChange((value: boolean) => this.isDark = value)
第四步:综合实战——构建一个简单Todo APP
4.1 项目搭建
- 创建新页面:TodoPage.ets。
- 导入组件:import { Column, Text, TextInput, Button, List, ForEach } from ‘@ohos.arkui’。
4.2 完整代码
@Entry
@Component
struct TodoPage {
@State input: string = '';
@State todos: string[] = [];
build() {
Column() {
Text('Todo List')
.fontSize(28)
.margin({ bottom: 20 })
Row() {
TextInput({ placeholder: '新Todo' })
.flexGrow(1)
.onChange((value: string) => this.input = value)
Button('添加')
.margin({ left: 10 })
.onClick(() => {
if (this.input) {
this.todos.push(this.input);
this.input = '';
}
})
}
.margin({ bottom: 20 })
List() {
ForEach(this.todos, (item: string, index: number) => {
ListItem() {
Row() {
Text(item)
.flexGrow(1)
Button('删除')
.type(ButtonType.Circle)
.backgroundColor(Color.Red)
.onClick(() => this.todos.splice(index!, 1))
}
.padding(10)
}
}, item => item)
}
.height(300)
.divider({ strokeWidth: 1, color: Color.Gray })
}
.width('100%')
.height('100%')
.padding(20)
.backgroundColor(Color.White)
}
}
- 运行效果:输入Todo,添加/删除列表,支持动态更新。
- 扩展:添加存储(使用@ohos.data.preferences),或动画(@AnimateTo)。
第五步:进阶技巧与常见坑(精通之路)
- 性能优化:用LazyForEach大列表;避免深层嵌套。
- 自定义组件:用@BuilderParam复用UI片段。
- 事件冒泡:用.gesture()优先级处理触摸。
- 调试:DevEco Inspector查看组件树;日志用hilog。
- 坑点:
- @State变化触发全重绘,避免不必要更新。
- 资源路径:$r(‘app.media.xxx’),别用相对路径。
- 跨页传参:用router.pushUrl() + getParams。
- 生态:用Omni-UI组件库(开源,25+扩展组件)加速开发。
第六步:快速自测清单(验证掌握)
- ArkUI是命令式还是声明式?(声明式)
- Text组件如何设置颜色?(.fontColor(Color.Red))
- List如何动态渲染?(ForEach)
- Button的onClick回调是什么?(箭头函数)
- 如何创建自定义组件?(@Component struct)
- 状态如何双向绑定?(@Link)
- 布局中space属性作用?(子项间距)
- Swiper如何自动播放?(.autoPlay(true))
掌握这些,你已从入门到精通ArkUI!想深入某个组件(如动画/图表)或完整APP项目?直接告诉我,我再展开。