鸿蒙应用开发初探:用 ArkTS 写个页面并跑在真机

举报
静水流深-云海 发表于 2026/09/22 14:15:09 2026/09/22
【摘要】 鸿蒙(HarmonyOS)应用用 ArkTS 语言、声明式 UI 开发。本文从环境准备讲起,带你写一个带状态管理、列表渲染和表单输入的完整 ArkTS 页面,说明组件生命周期与状态装饰器(@State/@Prop/@Link/@Provide),对比 ArkTS 与前端的异同、与 Flutter/React Native 的定位差异,并给出连真机预览、签名打包的关键步骤和常见新手坑。

鸿蒙(HarmonyOS)这两年存在感越来越强,很多团队开始考虑"顺手做个鸿蒙版"。它的应用开发用的是 ArkTS 语言 + 声明式 UI,写法和前端框架(尤其是 Vue/React)有神似之处,但底层和运行模型完全不同。这篇文章带你从零写一个能跑的页面,把状态管理、组件结构、真机运行这条线走通,后端同学也能顺着建立直觉。

一、开发环境怎么准备

官方工具是 DevEco Studio(基于 IDEA),首次打开会引导你装 SDK。关键点:

  • 装好 Node.js(ArkTS 构建链依赖它)和 HarmonyOS SDK;
  • 准备一台鸿蒙真机,或开启本地模拟器;
  • 真机调试需要在"设置-关于手机"里连点版本号打开开发者模式,并开启 USB 调试。
  • 首次编译会下载依赖和工具链,建议在网络好时一次性装完,避免中途断。

环境这块和 Android 开发很接近,卡住多半是 SDK 版本或 USB 驱动。

二、ArkTS 页面长什么样

ArkTS 用"声明式"写法描述 UI:你描述"界面应该是什么样",框架负责渲染和更新。一个最小带状态的页面:

// 一个计数器页面
@Entry
@Component
struct CounterPage {
  @State count: number = 0;   // 状态:变化会触发 UI 重渲染

  build() {
    Column() {
      Text(`当前计数:${this.count}`)
        .fontSize(24)
      Button('点我 +1')
        .onClick(() => { this.count++ })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

@State 修饰的变量一变,引用了它的 UI 自动刷新——这和前端的响应式更新是一个思路。

image.png

三、状态装饰器:组件内外怎么传

鸿蒙有一组状态装饰器,分工明确:

装饰器 作用范围 典型用途
@State 组件私有状态 本组件内会变的量
@Prop 父→子单向传 子组件接收父组件数据
@Link 父子双向绑定 子改了父也变
@Provide/@Consume 跨层级传 避免一层层透传

和前端的 props / v-model / provide-inject 一一能对上,有前端底子转过来很快。比如父子双向同步一个开关:

// 父
@State on: boolean = false;
Child({ isOn: $on })   // $ 表示传引用

// 子
@Component
struct Child {
  @Link isOn: boolean;
  build() {
    Toggle({ isOn: this.isOn })
      .onChange(v => this.isOn = v) // 改子,父也跟着变
  }
}

四、列表与表单:真实页面长这样

真实页面很少只有一个按钮,多是列表加输入。ArkTS 用 ForEach 渲染列表,用 @State 接表单输入:

@State items: string[] = ['任务一', '任务二', '任务三'];
@State input: string = '';

build() {
  Column() {
    TextInput({ placeholder: '输入新任务' })
      .onChange(v => this.input = v)
    Button('添加').onClick(() => {
      this.items.push(this.input);
      this.input = '';
    })
    List() {
      ForEach(this.items, (item) => {
        ListItem() { Text(item).fontSize(18) }
      }, (item) => item)
    }
  }
}

组件还有生命周期:aboutToAppear(出现前)、aboutToDisappear(销毁前),用来做数据初始化和清理,对应前端的 onMounted / onUnmounted。

五、跑在真机上要注意什么

  • 签名:真机运行必须配签名(debug 签名 DevEco 可自动生成),不签名装不上。
  • 权限:用到网络、存储、定位要在 module.json5 里声明,否则运行时直接被拦。
  • 预览 vs 真机:模拟器能快速看效果,但有些传感器、性能表现只有真机准,关键场景一定上真机验。
  • 多端适配:鸿蒙强调"一次开发、多端部署",布局尽量用相对单位,别写死像素。

六、和前端、和其他跨端的异同

相同点:声明式 UI、响应式状态、组件化拆分,思维模型几乎一致。

不同点:ArkTS 是强类型语言,编译期就能拦很多错;UI 描述最终编译成原生渲染,性能比 WebView 套壳好;运行在鸿蒙的分布式软总线上,能天然做跨设备协同(手机拉起平板继续看)。

方案 渲染 跨端 定位
ArkTS/鸿蒙 原生编译渲染 鸿蒙多设备协同 鸿蒙原生生态
React Native 原生组件桥接 iOS/Android 跨移动端
Flutter 自绘引擎 多端 跨端一致 UI

七、新手最容易踩的坑

第一,忘了在 module.json5 声明权限,运行时静默失败找不到原因——先看权限清单。

第二,把 @State 当成普通变量到处传,结果子组件不刷新。跨组件传要用 @Prop/@Link,别混。

第三,真机连不上,多半是 USB 调试没开或驱动没装,先确认 hdc list targets 能看到设备。

第四,布局写死像素,换设备就错位。多用 百分比 / vp 单位 / 弹性布局。

小结

鸿蒙应用开发对前端同学很友好——ArkTS 的声明式 + 状态装饰器,和 Vue/React 大同小异,转过来成本低;对后端同学,重点先建立"状态驱动 UI 重渲染"这个心智模型。真正上手时,卡点通常在环境签名、权限声明和真机联调这几步,把这几样理顺,写个像样的页面一天就能跑起来。多端部署和分布式协同的能力,是它相比单纯写个 App 更值得关注的地方,也是未来值得提前布局的方向。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。