鸿蒙语言基础学习经验分享:从困惑到渐入佳境

news/2025/11/8 22:02:20/文章来源:https://www.cnblogs.com/waeng-luo/p/19203161

前言:为什么学习鸿蒙语言?

随着鸿蒙生态的快速发展,作为开发者不得不关注这个新兴的系统平台。我最初接触鸿蒙时,带着移动开发的经验,也带着许多疑问:鸿蒙开发到底有什么不同?ArkTS和Java/JS有什么区别?分布式能力如何实现?经过一段时间的学习和实践,我积累了一些经验,希望能为正在入门的同学提供参考。

一、 ArkTS语言:TypeScript的鸿蒙进化

1.1 初识ArkTS的困惑与理解

刚开始学习ArkTS时,我最深的感受是:既熟悉又陌生

// 这是一个简单的ArkTS组件
@Component
struct MyComponent {@State message: string = 'Hello HarmonyOS'build() {Column() {Text(this.message).fontSize(20).onClick(() => {this.message = 'Hello ArkTS!'})}.width('100%').height('100%')}
}

学习心得

  • 如果你有TypeScript基础,ArkTS上手会很快
  • 装饰器@Component@State是核心概念,需要重点掌握
  • 声明式UI的编写方式与Flutter/SwiftUI类似

1.2 状态管理的核心:装饰器的理解

我的学习路径

  1. 先掌握@State:组件内状态管理
  2. 再学习@Prop:父子组件单向同步
  3. 理解@Link:父子组件双向同步
  4. 最后掌握@Provide@Consume:跨组件状态管理
// 装饰器使用示例
@Component
struct ParentComponent {@State parentMessage: string = '来自父组件'build() {Column() {ChildComponent({ message: this.parentMessage })Button('修改消息').onClick(() => {this.parentMessage = '父组件修改的消息'})}}
}@Component
struct ChildComponent {@Prop message: stringbuild() {Text(this.message)}
}

二、 声明式UI:思维模式的转变

2.1 从命令式到声明式的适应过程

命令式UI(传统Android)

TextView textView = findViewById(R.id.text_view);
textView.setText("新内容");
textView.setVisibility(View.VISIBLE);

声明式UI(鸿蒙ArkTS)

// UI是状态的函数,状态改变UI自动更新
@State isVisible: boolean = true
@State content: string = '新内容'build() {if (this.isVisible) {Text(this.content)}
}

适应技巧

  • 忘记直接操作UI组件的方式
  • 把重点放在数据状态的管理上
  • 理解"UI = f(State)"的概念

2.2 布局系统的学习心得

鸿蒙的布局系统相对直观,但需要理解其排列规则:

build() {Column() {          // 纵向排列Row() {           // 横向排列Text('第一个').layoutWeight(1)  // 权重布局Text('第二个').layoutWeight(2)}.height(100)Stack() {         // 层叠布局Text('底层文本')Text('上层文本').align(Alignment.Top)}}.justifyContent(FlexAlign.SpaceBetween)  // 主轴对齐方式
}

布局学习建议

  1. 先从Column、Row、Stack这三个基础容器开始
  2. 掌握主轴和交叉轴的对齐概念
  3. 多练习各种布局场景,理解排列规则

三、 核心概念:重点与难点突破

3.1 组件生命周期的理解

组件的生命周期是鸿蒙开发的重点,我通过这张图来记忆:

@Component
struct MyComponent {aboutToAppear() {// 组件即将出现:初始化数据console.log('组件即将创建')}build() {// 构建UI}aboutToDisappear() {// 组件即将销毁:清理资源console.log('组件即将销毁')}
}

生命周期学习心得

  • aboutToAppear ≈ Android的onCreate
  • aboutToDisappear ≈ Android的onDestroy
  • 但理念不同:鸿蒙组件可能被频繁创建和销毁

3.2 渲染控制的条件掌握

条件渲染和循环渲染是日常开发中的高频功能:

@Component
struct ControlRendering {@State isLogin: boolean = false@State userList: Array<string> = ['用户1', '用户2', '用户3']build() {Column() {// 条件渲染if (this.isLogin) {Text('欢迎回来!')} else {Button('点击登录').onClick(() => {this.isLogin = true})}// 循环渲染ForEach(this.userList, (item: string) => {ListItem({ content: item })}, (item: string) => item)}}
}

四、 学习资源与实操建议

4.1 我的学习资源路径

  1. 官方文档(必看):

    • ArkTS语言官方文档
    • 声明式UI开发指南
    • 组件参考文档
  2. 实践平台

    • DevEco Studio:一定要熟练使用
    • 本地模拟器:调试很方便
    • 真机调试:体验真实效果
  3. 学习项目

    • 官方Sample:理解最佳实践
    • 自己重构小项目:从简单到复杂

4.2 实操建议:避免我走过的弯路

新手常见误区

  • ❌ 一开始就想做复杂项目
  • ❌ 不重视基础语法和概念
  • ❌ 忽略官方示例代码
  • ❌ 不习惯查阅官方文档

正确学习路径

  1. ✅ 搭建环境,创建Hello World项目
  2. ✅ 学习基础组件:Text、Button、Image等
  3. ✅ 掌握布局:Column、Row、Stack
  4. ✅ 理解状态管理:@State、@Prop、@Link
  5. ✅ 实践页面导航和数据传递
  6. ✅ 尝试分布式能力开发

五、 实战案例:我的第一个鸿蒙应用

分享我学习时做的一个简单待办事项应用:

// 简单的待办应用
@Entry
@Component
struct TodoApp {@State tasks: Array<string> = []@State inputText: string = ''build() {Column({ space: 10 }) {// 输入区域Row() {TextInput({ text: this.inputText, placeholder: '输入新任务' }).onChange((value: string) => {this.inputText = value}).layoutWeight(1)Button('添加').onClick(() => {if (this.inputText) {this.tasks.push(this.inputText)this.inputText = ''}})}.width('100%')// 任务列表List({ space: 5 }) {ForEach(this.tasks, (task: string, index?: number) => {ListItem() {Row() {Text(task).layoutWeight(1)Button('删除').onClick(() => {this.tasks.splice(index!, 1)})}}}, (task: string) => task)}.layoutWeight(1)}.padding(10)}
}

六、 学习总结与展望

6.1 核心收获

  1. 思维转变:从命令式到声明式的思维方式转变是最大的挑战,也是最重要的收获
  2. 语言优势:ArkTS的类型安全和现代语法让开发更高效
  3. 生态潜力:鸿蒙的分布式能力为未来应用开发提供了更多可能性

6.2 持续学习建议

  • 紧跟官方更新:鸿蒙还在快速发展,新特性不断出现
  • 参与社区讨论:很多问题在技术社区能找到答案
  • 实践出真知:多写代码,多调试,遇到问题不要怕

鸿蒙开发的学习曲线前期可能较陡,但一旦掌握了核心概念,就会发现其设计理念的先进性和开发效率的提升。希望我的经验能帮助你少走弯路,快速掌握鸿蒙开发基础!

一起加油,拥抱鸿蒙生态的无限可能!

附:鸿蒙学习资源直达链接

https://developer.huawei.com/consumer/cn/training/classDetail/cfbdfcd7c53f430b9cdb92545f4ca010?type=1?ha_source=hmosclass&ha_sourceId=89000248

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/960012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修复达梦EFCore驱动布尔类型兼容问题

dm库相比其他库本身缺少一些语法差异,也可以说是缺陷。 比如: 0和1无法直接在sql中当作真假值用,where 0这种写法不支持,报错:查询使用值表达式作为过滤条件; t.field is null 也无法直接作为select项; 不支持O…

2021:【例4.6】最大公约数

提交数:98849 通过数: 64137 【题目描述】 求两个正整数m ,n 的最大公约数。 【输入】 输入m ,n 。 【输出】 m ,n 的最大公约数。 【输入样例】 4 6 【输出样例】 2 【提示】 【数据范围】 对于全部数据:m,n&l…

详细介绍:Java数据结构 - 二叉树

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

吴恩达深度学习课程二: 改善深层神经网络 第二周:优化算法(二)指数加权平均和学习率衰减

此分类用于记录吴恩达深度学习课程的学习笔记。 课程相关信息链接如下:原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai github课程资料,含课件与笔记:吴恩达深度学习教学资料 课程配套练习(中英)与答案…

*题解:P1712 [NOI2016] 区间

原题链接 解析 笔者原本的思路是按照左端点排序考虑交点,但是发现无法快速处理出极差;还想过了不考虑交点直接做。 为什么不再回溯一层呢? 由于要求长度的极差,所以考虑将区间按照长度排序。按照这个顺序依次覆盖每…

Day 20

列书单的下午:想给专业学习搭起“知识骨架” 整理书桌时,翻到之前工程实训的代码笔记,里面还夹着几张没弄懂的问题纸条——“红黑树怎么保持平衡?”“MySQL事务隔离级别具体怎么用?”“Spring框架底层和Servlet有…

考试(高二上)

回忆,成了大问题。时间 名称 分 班排 年排0901 化学1 42/50 35 87/1620903 英语定时1 73.5/80 12 290908 化学2 52/60 14 36/1620908 生物定时1 94 14 410910 物理定时1 62/62 1 10910 英语定时2 54 52 7920914 【周考…

rustfs一键脚本配置方式

rustfs官方安装方式: https://github.com/rustfs/rustfs/blob/main/README_ZH.md 按照官方说明,一般有四种启动方法:一键脚本快速启动 Docker快速启动 从源码构建 使用Helm Chart部署控制台可以通过浏览器导航到htt…

详细介绍:风机水泵改软起技术分析(XX公司)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

11.8组会

肿瘤亚克隆重建: 肿瘤的演化过程是一个复杂且多步骤的过程,涉及正常细胞通过体细胞突变(somatic mutations)的逐步积累而转变为癌细胞。这些突变受到染色质结构以及内外源性诱变压力的影响。当某些特定的突变赋予细…

Entry HDL原理图导出料单设置步骤

Tools>package utilities>bill of materrials设置1 ,勾选”Apply Filters”,如果选择Txt文档格式时选择“Spreadsheet Fomat”设置2料单过滤设置 Physical part specificationspart Fiters 选择BOM_IGNONE, …

Allegro:如何手动在PCB中添加元器件以及删除元器件

一般情况下,我们PCB中的元器件以及连接关系都是从原理图导入,PCB一般是不允许去修改或者添加元器件的,这里简单介绍一下,,PCB中是可以手动添加或者删除元器件的,一般不推荐而已,具体的操作步骤如下所示: 第一步…

银河麒麟KylinV10-sp3操作系统桌面环境安装

以下是在最小化安装的国产银河麒麟V10-SP1版服务器操作系统上安装UKUI桌面环境的步骤,供大家参考使用。 修改源配置 如果可以访问互联网,直接使用官网源配置,不需要更改啥内容。不可以访问外网源的话,考虑挂载系统…

重练算法(代码随想录版) day4 - 链表part2

**今日刷题量:4 ** 当前刷题总量:25 Easy: 14 Mid: 10 Hard: 1 Day 4 思想方法 1.一定要学会画图,思路捋不清楚的时候画图去拆解每一步的操作,再尝试用一个或多个指针去模拟 2.快慢指针找链表相交点 3.找环问题,F…

实用指南:【第十七周】机器学习笔记06

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

为什么OAuth2与SSO经常混为一谈?

简介 最近在工作中遇到了一个问题,在实现OAuth2的过程中,发现公司的实际落地与理论不完全相同。故此复习一下。 What is OAuth2? OAuth2(OAuth2.0)是一个开放标准的授权框架,用于第三方应用(客户端)在取得用户(资源…

完整教程:高斯隐马尔可夫模型:原理与应用详解

完整教程:高斯隐马尔可夫模型:原理与应用详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

计算机毕业设计选题推荐:基于SpringBoot和Vue的快递物流仓库管理系统【源码+文档+调试】 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

耄大厨——AI厨师智能体(3-程序调用)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

flask: 保存异常时的错误信息和堆栈到日志

一,代码: 定义异常的处理 app.py import os from dotenv import load_dotenvfrom flask import Flask,jsonifyfrom flask_sqlalchemy import SQLAlchemy# 加载变量 dotenv_path = os.path.join(os.path.dirname(__fi…