初探鸿蒙:从概念到实践

一、鸿蒙开发的环境准备

  • 开发工具:使用 DevEco Studio,支持 ArkTS 语法。          
  • 系统要求:确保计算机符合 DevEco Studio 的最低系统需求。
  • 安装步骤:下载 DevEco Studio,安装合适的 SDK 和模拟器

二、鸿蒙应用可以用哪些语言进行开发 

  • ArkTS(方舟编程语言):这是HarmonyOS 3开始引入的一种全新语言,类似于TypeScript。它适合用于开发UI和应用逻辑,特别是在HarmonyOS应用和跨平台开发中具有很好的支持。

  • JavaScript:主要用于轻量级的应用开发,特别适合界面开发和简单的逻辑处理。HarmonyOS早期版本对JavaScript的支持较好。

  • Java:适合开发一些通用应用逻辑和业务逻辑,特别是移动设备相关的应用。HarmonyOS底层对Java有良好的支持,但最新版本推荐转向ArkTS。

  • C/C++:适合开发系统底层、驱动、性能要求高的组件以及跨平台应用逻辑。C/C++在HarmonyOS中用于高性能和底层开发,并且可以通过NDK(Native Development Kit)进行开发。

  • Kotlin:虽然Kotlin在鸿蒙中不是官方推荐的语言,但由于其与Java兼容,可以通过Java的方式间接使用。

  • Python、Rust等:虽然鸿蒙官方不直接支持这些语言,但可以通过绑定或其他中间层的方式进行集成,适合特定需求的项目。

其中ArkTS 是目前鸿蒙系统推荐的主要开发语言,ArkTS 基于 TypeScript,并在 HarmonyOS 上进行了定制和优化,方便开发者在鸿蒙系统的多设备和跨平台环境中使用。ArkTS 在设计上支持多种设备,包括手机、平板、智能家居、智能手表等。同时ArkTS 由鸿蒙的方舟编译器(Ark Compiler)进行编译,这种编译器可以将 ArkTS 代码直接编译成机器码而不是通过虚拟机运行,从而显著提升运行速度和性能 

三、ArkTS中常用的UI组件有哪些

1.Text - 文本组件  (用于显示静态文本内容,可以自定义字体大小、颜色、对齐方式等)

Text("Hello HarmonyOS")
    .fontSize(20)
    .fontColor('#333333')
    .alignment('center');

2.Button - 按钮组件  (用于触发点击事件,支持样式自定义)

Button("Click Me")
    .onClick(() => {
        console.log("Button clicked");
    })
    .width(200)
    .height(50)
    .backgroundColor('#007DFF');

3.TextInput - 文本输入框  (允许用户输入文本内容,可以设置占位符、最大长度等属性)

TextInput({ placeholder: 'Enter your name' })
    .fontSize(18)
    .textColor('#000000')
    .placeholderColor('#AAAAAA')
    .onChange((value) => {
        console.log("User input:", value);
    });

4.Image - 图片组件  (用于显示图片,支持本地和网络图片路径)

Image($r('image.icon'))
    .width(100)
    .height(100)
    .objectFit('cover');  // cover, contain, fill 等

5.List - 列表组件  (用于显示一系列相同结构的内容。通过 ForEach 动态渲染列表数据)

List({ space: 10 }) {
    ForEach([1, 2, 3, 4, 5], (item) => {
        Text(`Item: ${item}`)
            .fontSize(16)
            .margin(10);
    });
}

6.Toggle - 开关组件  (用于切换开启和关闭状态)

@Observed isToggled: boolean = false;

Toggle({ value: this.isToggled })
    .onChange((newValue) => {
        this.isToggled = newValue;
        console.log("Toggle status:", newValue);
    });

7.Slider - 滑块组件  (用于选择一个范围值,比如音量、亮度等)

@Observed volume: number = 50;

Slider({ value: this.volume, min: 0, max: 100 })
    .onChange((value) => {
        this.volume = value;
        console.log("Volume:", value);
    });

8.Progress - 进度条证件  (用于显示任务进度,例如下载进度、加载进度等)

Progress({ value: 0.7 })
    .color('#4CAF50')
    .trackColor('#E0E0E0')
    .strokeWidth(5);

9.Checkbox - 复选框组件  (用户可以选择或取消选择,适合多选的场景)

@Observed isChecked: boolean = false;

Checkbox({ value: this.isChecked })
    .onChange((newValue) => {
        this.isChecked = newValue;
        console.log("Checkbox checked:", newValue);
    });

10.Radio - 单选按钮  (用于单项选择,常配合 RadioGroup 使用)

@Observed selectedValue: number = 1;

RadioGroup({ value: this.selectedValue })
    .onChange((value) => {
        this.selectedValue = value;
    }) {
    Radio({ value: 1, label: 'Option 1' });
    Radio({ value: 2, label: 'Option 2' });
    Radio({ value: 3, label: 'Option 3' });
}

11.Grid - 网格布局  (用于创建多列布局的网格视图)

Grid({ columns: 3, space: 10 }) {
    ForEach([1, 2, 3, 4, 5, 6], (item) => {
        Text(`Item ${item}`)
            .fontSize(16)
            .backgroundColor('#E0E0E0')
            .padding(10);
    });
}

12.ScrollView - 滚动视图  (用于容纳可滚动的内容,例如长列表、长文本)

ScrollView() {
    Column() {
        Text("Scrollable Content").fontSize(20).margin(10);
        // 其他长内容...
    }
}

13.Picker - 选择器  (适用于日期、时间等数据选择)

Picker({ range: ['Option 1', 'Option 2', 'Option 3'] })
    .onChange((value) => {
        console.log("Picker selected:", value);
    });

四、基础组件的使用

1.鸿蒙使用声明式语法创建 UI 组件,以下示例创建了一个文本组件和按钮组件

import { Component, Observed } from '@ohos/arkui';

@Component
struct HelloWorld {
    @Observed count: number = 0;

    build() {
        Column() {
            Text(`Hello HarmonyOS! Current count: ${this.count}`)
                .fontSize(20)
                .fontColor('#333333')
                .margin(20);

            Button("Click Me")
                .onClick(() => {
                    this.count += 1;
                })
                .width('80%')
                .height(50)
                .backgroundColor('#007DFF')
                .margin(20);
        }
    }
}

2.使用 ArkTS 通过条件语句和循环来动态控制组件显示

build() {
    Column() {
        if (this.count > 5) {
            Text("Count is greater than 5!")
                .fontSize(18)
                .fontColor('#FF0000');
        }

        ForEach([1, 2, 3, 4, 5], (item) => {
            Text(`Item: ${item}`)
                .fontSize(16);
        });
    }
}

3.函数定义和调用

@Entry
@Component
struct MyComponent {
  @State result: number = 0;

  // 定义一个函数,用于计算两个数字的和
  addNumbers(a: number, b: number): number {
    return a + b;
  }

  // 调用函数并更新状态
  onCalculate() {
    this.result = this.addNumbers(5, 10); // 调用 addNumbers 函数,传入参数 5 和 10
  }

  // 组件的界面布局
  build() {
    Column() {
      // 按钮用于触发计算
      Button("计算 5 + 10") {
        onClick: () => this.onCalculate()  // 调用 onCalculate 来更新 result
      }

      // 显示计算结果
      Text("计算结果: " + this.result)
        .fontSize(20)
    }
  }
}

4.页面路由跳转

import { router } from '@kit.ArkUI'

@Entry
@Component
struct MainPage {
  build() {
    Column() {
      Button('跳转到详情页')
        .onClick(() => {
          // 跳转到 DetailPage 页面
          router.pushUrl({
            uri: 'pages/DetailPage' // 目标url
          });
        });
    }
  }
}


/**
* 其他适用方法
*/

// push page
router.pushUrl({ url:"pages/pageOne", params: null })

// pop page
router.back({ url: "pages/pageOne" })

// replace page
router.replaceUrl({ url: "pages/pageOne" })

// clear all page
router.clear()

// 获取页面栈大小
let size = router.getLength()

// 获取页面状态
let pageState = router.getState()

5.发送http请求

import { http } from '@kit.NetworkKit'

let httpRequest = http.createHttp(); // 每一个httpRequest对应一个HTTP请求任务,不可复用

function sendPostRequest() {
    httpRequest.request({
        method: 'POST',
        url: 'https://jsonplaceholder.typicode.com/posts',
        header: {
          'Content-Type': 'application/json'
        },
        connectTimeout: 5000,
        readTimeout: 5000,
        extraData: postData // 设置 POST 请求的 body 数据
      }, (err, data) => {
        if (err) {
          console.error('请求失败:', err);
          return;
        }
        console.log('请求成功,返回数据:', data);
      }
   )
}

sendPostRequest()

 6.父子组件

// 父组件
import { ChildComponent } from './ChildComponent';

@Entry
@Component
struct ParentComponent {
  private message: string = 'Hello from Parent';

  private handleChildClick() {
    this.message = '子组件按钮已点击!';
    console.log('子组件的按钮被点击了');
  }

  build() {
    Column() {
      Text('这是父组件')
        .fontSize(20)
        .margin({ bottom: 20 })
      
      // 嵌套子组件,并传递属性
      ChildComponent({
        message: this.message,
        onMessageClick: this.handleChildClick.bind(this)
      });
    }
  }
}
// 子组件

@Component
struct ChildComponent {
  @Prop message: string;
  @Prop onMessageClick: () => void;

  build() {
    Column() {
      Text(this.message)
        .fontSize(18)
        .margin({ bottom: 10 })
      Button('点击我')
        .onClick(() => {
          // 调用父组件传入的回调函数
          if (this.onMessageClick) {
            this.onMessageClick();
          }
        });
    }
  }
}

五、ArkTS 装饰器

ArkTS 中,装饰器(Decorator)是一种特殊的语法,用于给类、方法或属性添加特定的功能或行为。鸿蒙系统中的 ArkTS 装饰器提供了特定的标记,以便开发者快速定义页面结构、组件类型和状态管理等。

  • @Component:表示自定义组件。
  • @Entry:表示该自定义组件为入口组件。
  • @State:表示组件中的状态变量,状态变量变化会触发UI刷新。
  • @Prop:用于父子组件间的单向数据同步。
  • @Link:用于父子组件间的双向数据同步。
  • @Provide和@Consume:用于与后代组件双向同步。
  • @Observed和@ObjectLink:用于嵌套类对象属性变化时的双向数据同步。
  • @Builder和@BuilderParam:用于封装和复用UI描述。
  • @Styles:用于定义组件重用样式。
  • @Extend:用于扩展原生组件样式。

六、组件生命周期

自定义组件和页面之间的关系

  • 自定义组件:@Component装饰的UI单元,可以组合多个系统组件实现UI的复用,可以调用组件的生命周期。

  • 页面:即应用的UI页面。可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。只有被@Entry装饰的组件才可以调用页面的生命周期。

页面生命周期,即被@Entry装饰的组件生命周期,提供以下生命周期接口:

  • onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景。

  • onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。

  • onBackPress:当用户点击返回按钮时触发。

组件生命周期,即一般用@Component装饰的自定义组件的生命周期,提供以下生命周期接口:

  • aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。

  • onDidBuild:组件build()函数执行完成之后回调该接口,不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,这可能会导致不稳定的UI表现。

  • aboutToDisappear:aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

 生命周期流程如下图所示,下图展示的是被@Entry装饰的组件(页面)生命周期。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析

本文是将文章《XGBoost算法的原理推导》中的公式单独拿出来做一个详细的解析,便于初学者更好的理解。 我们定义一颗树的复杂度 Ω Ω Ω,它由两部分组成: 叶子结点的数量;叶子结点权重向量的 L 2 L2 L2范数; 公式(…

MySQL数据库基础(一) MySQL安装及数据类型

目录 一、MySQL数据裤简介 二、MySQL数据的安装 2.1、MySQL安装 2.2、修改MySQL密码登录策略 三、数据库基础管理 3.1、连接方式及数据储存流程 3.2、库管理命令 3.3、表管理命令 3.4、记录管理命令 四、MySQL数据类型 4.1、常见信息种类 4.2、字符型 4.3、数值型 4.4、日期时间…

《现代工业经济和信息化》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答: 问:《现代工业经济和信息化》是不是核心期刊? 答:不是,是知网收录的正规学术期刊。 问:《现代工业经济和信息化》级别? 答:省级。主管单位:山西省工业和…

SpringCloudAlibabaSidecar整合异构微服务

Spring Cloud Alibaba Sidecar概述 这里引用官方文档的原话: spring-cloud-starter-alibaba-sidecar 是一个用来快速完美整合(享受服务发现的优势、有负载均衡、有断路器) Spring Cloud 与异构微服务(非Spring Cloud应用&#xf…

Vue 组件传递数据-Props(六)

一、Props传递静态数据 defineProps() 和 defineEmits() 为了在声明 props 和 emits 选项时获得完整的类型推导支持&#xff0c;我们可以使用 defineProps 和 defineEmits API&#xff0c;它们将自动地在 <script setup> 中可用&#xff1a; defineProps 和 defineEmits …

SpringBoot源码解析(三)

一、手写模拟springboot核心流程 前面两章内容已经详细解释了springboot的核心原理与启动流程&#xff0c;本章通过手写模拟实现一个SpringBoot&#xff0c;让大家能以非常简单的方式就能知道SpringBoot大概是如何工作的&#xff0c;作为对上两章内容的一个巩固。 一、模拟Sp…

Python实战:调用淘宝API以抓取商品页面数据

在数据驱动的商业决策中&#xff0c;获取电商平台的商品数据至关重要。淘宝作为中国最大的在线购物平台&#xff0c;其商品数据对于市场分析、价格监控和竞品研究等方面都具有极高的价值。本文将通过一个Python实战案例&#xff0c;展示如何调用淘宝API来抓取商品页面的数据。 …

STL---迭代器

本文来源&#xff1a;《C语言程序设计》第10章 理解迭代器对于理解STL框架并掌握STL的使用至关重要。 迭代器是泛化的指针&#xff0c;STL算法利用迭代器对存储在容器中的元素序列进行遍历&#xff0c;迭代器提供了访问容器中每个元素的方法。 虽然指针也是一种迭代器&#…

设计模式-七个基本原则之一-单一职责原则 + SpringBoot案例

单一职责原理:(SRP) 面向对象七个基本原则之一 清晰的职责&#xff1a;每个类应该有一个明确的职责&#xff0c;避免将多个责任混合在一起。降低耦合&#xff1a;通过将不同的职责分开&#xff0c;可以降低类之间的耦合度&#xff0c;提高系统的灵活性。易于维护&#xff1a;当…

京东AI单旋旋转验证码98准确率通杀方案

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 本文滑块识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/other/12 京东单旋验证码最近更新了,使用AI生成,要求识别角度,以下是部分数据集: 接下…

playground.tensorflow神经网络可视化工具

playground.tensorflow 是一个可视化工具&#xff0c;用于帮助用户理解深度学习和神经网络的基本原理。它通过交互式界面使用户能够构建、训练和可视化简单的神经网络模型。以下是一些主要的数学模型和公式原理&#xff0c;它们在这个平台中被应用&#xff1a; 1. 线性模型 线…

[vulnhub] DarkHole: 2

https://www.vulnhub.com/entry/darkhole-2,740/ 端口扫描主机发现 探测存活主机&#xff0c;185是靶机 # nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-08 18:02 CST Nmap scan report for 192.168.75.1 Host is up (0.…

【开源免费】基于SpringBoot+Vue.JS宠物咖啡馆平台(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 064 &#xff0c;文末自助获取源码 \color{red}{T064&#xff0c;文末自助获取源码} T064&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

移动取证和 Android 安全

当今的数字时代已经产生了许多技术进步&#xff0c;无论是智能手机还是虚拟现实、人工智能和物联网 (IoT) 等下一代基础技术。 智能手机已不再只是奢侈品&#xff0c;而是我们生存所必需的东西。根据各种统计数据&#xff0c;如今全球有超过 50% 的人使用手机。 由于数据存储…

C++builder中的人工智能(14):修正线性单元(ReLU)激活函数

这篇文章将解释在人工神经网络&#xff08;ANN&#xff09;中修正线性函数&#xff08; Rectified Linear Function&#xff09;是什么&#xff0c;以及如何使用ReLU激活函数。让我们回顾一下激活函数的概念&#xff0c;并定义这些术语。学习修正线性函数对于使用C软件编写程序…

【信号处理】基于联合图像表示的深度学习卷积神经网络

Combined Signal Representations for Modulation Classification Using Deep Learning: Ambiguity Function, Constellation Diagram, and Eye Diagram 信号表示 Ambiguity Function(AF) 模糊函数描述了信号的两个维度(dimensions):延迟(delay)和多普勒(Doppler)。 …

05 SQL炼金术:深入探索与实战优化

文章目录 SQL炼金术&#xff1a;深入探索与实战优化一、SQL解析与执行计划1.1 获取执行计划1.2 解读执行计划 二、统计信息与执行上下文2.1 收集统计信息2.2 执行上下文 三、SQL优化工具与实战3.1 SQL Profile3.2 Hint3.3 Plan Baselines3.4 实战优化示例 SQL炼金术&#xff1a…

MySQL_第13章_视图

1. 常见的数据库对象 2. 视图概述 2.1 为什么使用视图&#xff1f; 视图一方面可以使用表的一部分而不是所有的表&#xff0c;另一方面也可以针对不同的用户制定不同的查询视图。 2.2 视图的理解 视图是一种虚拟表&#xff0c;本身是不具有数据的&#xff0c;占用很少的内存…

【代码随想录day24】【C++复健】93.复原IP地址; 78.子集 ;90.子集II

今天写代码的时候整体状态其实就不太好&#xff0c;整个人晕晕的&#xff0c;好多时候写出来的代码也是多少带点愚蠢。 93.复原IP地址 看卡哥说“大家做完 分割回文串 之后&#xff0c;本题就容易很多了”还以为是秒杀题呢&#xff0c;结果直接被卡住。怎么说呢&#xff0c;…

Vue:条件渲染 列表渲染

Vue&#xff1a;条件渲染 & 列表渲染 条件渲染v-showv-if 列表渲染v-for数组对象 条件渲染 Vue允许依据一定的条件&#xff0c;通过表达式的布尔值&#xff0c;来决定是否渲染某些元素&#xff0c;其依赖于v-show和v-if两条指令。 v-show v-show可以依据表达式的布尔值&…