鸿蒙APP开发从入门到精通:ArkUI组件库详解与常用组件实战

鸿蒙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)。

第五步:进阶技巧与常见坑(精通之路)

  1. 性能优化:用LazyForEach大列表;避免深层嵌套。
  2. 自定义组件:用@BuilderParam复用UI片段。
  3. 事件冒泡:用.gesture()优先级处理触摸。
  4. 调试:DevEco Inspector查看组件树;日志用hilog。
  5. 坑点
  • @State变化触发全重绘,避免不必要更新。
  • 资源路径:$r(‘app.media.xxx’),别用相对路径。
  • 跨页传参:用router.pushUrl() + getParams。
  1. 生态:用Omni-UI组件库(开源,25+扩展组件)加速开发。

第六步:快速自测清单(验证掌握)

  1. ArkUI是命令式还是声明式?(声明式)
  2. Text组件如何设置颜色?(.fontColor(Color.Red))
  3. List如何动态渲染?(ForEach)
  4. Button的onClick回调是什么?(箭头函数)
  5. 如何创建自定义组件?(@Component struct)
  6. 状态如何双向绑定?(@Link)
  7. 布局中space属性作用?(子项间距)
  8. Swiper如何自动播放?(.autoPlay(true))

掌握这些,你已从入门到精通ArkUI!想深入某个组件(如动画/图表)或完整APP项目?直接告诉我,我再展开。

文章已创建 4026

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部