03鸿蒙ArkTS应用开发及ArkTS语言学习

news2024/9/24 3:28:17

目录

  • 1、概述
    • 1.1、模型到底是什么?
    • 1.2、Stage和FA模型最大的区别到底是什么?
    • 1.3、ArkTs和JS开发语言该怎么选呢?
  • 2、一张图认识ArkTS应用的工程目录
  • 3、ArkTS开发语言
    • 3.1、ArkTS语言从哪里来?
    • 3.2、ArkTS基本语法
  • 4、开发一个登录界面
  • 5、总结
  • 6、参考文档

1、概述

主要说一个东西,模型,当我们在新建一个鸿蒙应用工程项目时,会要求你选择模型,如下图所示:

在这里插入图片描述
选择Model->Stage,能使用ArkTS开发语言。

在这里插入图片描述

选择Model->FA,能使用ArkTS和JS开发语言。

这两张图看出一个结论:在SDK为API9时,FA比Stage要多一种开发语言。

1.1、模型到底是什么?

应用模型是HarmonyOS为开发者提供的应用程序所需能力的抽象提炼,它提供了应用程序必备的组件和运行机制。

Stage和FA模型又是什么?

  • FA(Feature Ability)模型: HarmonyOS API 7开始支持的模型,已经不再主推。FA模型开发可见FA模型开发概述。
  • Stage模型: HarmonyOS API 9开始新增的模型,是目前主推且会长期演进的模型。在该模型中,由于提供了AbilityStage、WindowStage等类作为应用组件和Window窗口的“舞台”,因此称这种应用模型为Stage模型。

1.2、Stage和FA模型最大的区别到底是什么?

一句话,FA模型属于淘汰类型,现在最新的API都主要使用Stage模型。
由此,我们知道了如何选择模型。

1.3、ArkTs和JS开发语言该怎么选呢?

官方文档中说明如下:
在这里插入图片描述
提炼一下,构建一个比较大且复杂的应用,推荐使用ArkTS,也是做过移动应用开发人员的首选。

2、一张图认识ArkTS应用的工程目录

在这里插入图片描述
目前官方已知的就是这么多信息,未知的我们用到的时候再去认识它。

3、ArkTS开发语言

知道怎么选模型,知道选什么开发语言,知道了项目工程目录,接下来我们就是准备编写代码,但是编写代码前,还需要了解ArkTS的基本语法,这样以便于我们写出更复杂的应用。

3.1、ArkTS语言从哪里来?

ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。因此,在学习ArkTS语言之前,建议开发者具备TS语言开发能力,这个不是一般的开发者都具备的能力,本着最小化学习原则。

TypeScript 又是基于 Javascript语言的基础之上进行的扩展,但它最终还是会被编译成原始的 JavaScript。

所以,从JavaScript->TypeScript ->ArkTs的过程可以看出,JS将成为应用开发语言的宇宙中心。

因为ArkTS已经做了很多基础的控件和插件,封装了无数的API供我们使用,基本上已经够用了,ArkTS和Flutter的写法有些类似,所以本着边学边实践的原则,我们还是先去了解一下TS这个语言,主要从声明变量、调用函数、条件语句、数组使用、列表循环、创建类、创建接口这几个方面去写一写案例。

TypeScript语法学习案例如下:

//字符串类型
let helloString : string = "Hello TypeScript!";
console.log(helloString);

//数字类型
let helloNumber:number=9;
console.log("Hello 十进制数字 "+ helloNumber);

//布尔类型
let helloBool:boolean=true;
console.log("Hello 布尔类型 "+ helloBool);

//数组
let helloArr:number[]=[1,2];
let helloArr2:Array<number>=[1,2];

let helloArr3:string[]=["hello","TypeScript"];

//元组类似位置数组
let kv:[number,String,boolean];
kv=[1,"Hello",true];
console.log(kv[2]);

//Map类型,在线工具运行失败了
//let myMap = new Map();
//myMap.set("Hello",1);
//myMap.set("TypeScript",2);
//myMap.set("!",3);

//for(let key of myMap.keys()){
	//console.log(key);
//}



//申明变量
var userName:string;
var userPsd:string;
userName="小明";
userPsd="123456";
console.log(userName+"的密码是:"+userPsd);
//运算符

var number1:number=9527;
var number2:number=3;
console.log(number1+number2);

//条件语句
if(number1>number2){
	console.log(number1+"比"+number2+"大:"+(number1-number2));
}else{
	console.log(number1+"比"+number2+"小:"+(number2-number1));
}

//循环语句
let helloArr4:string[]=["hello","TypeScript"];
var i=0;
for(i=0;i<helloArr4.length;i++){
	console.log(helloArr4[i]);
}

//函数调用
function sum(x,y):number{
	return x+y;
}

console.log("求和:"+sum(1,1));

//创建一个类 ,在线工具运行失败了
//class MyTs{
//	var str:string;
//	constructor(str:string){
//		this.str=str;
//	}	
	
//	show():void{
//		console.log("在新建的类中打印:"+str);
//	}
//}

//var myTs=new MyTs("函数");
//myTs.show();

//接口,在线工具运行失败了
//interface IUser { 
//    userName:string
//    userPsd:string 
//    showResult():string 
//} 
//实现接口,在线工具运行失败了
//var user:IUser = { 
//    userName:string="小明"
//    userPsd:string="123456" 
//    showResult():string =>{
//		return userName +"/"+ userPsd
//	} 
//}


上面的案例看起来似曾相识,所以有了这些基础印象之后,我们就可以开始继续学习ArkTS语言了。

3.2、ArkTS基本语法

来看一个ArkTS组件页面的基本组成如下图所示:

在这里插入图片描述

  • 装饰器:用于装饰类、结构、方法以及变量,并赋予其特殊的含义。如上述示例中@Entry、@Component和@State都是装饰器,@Component表示自定义组件,@Entry表示该自定义组件为入口组件,@State表示组件中的状态变量,状态变量变化会触发UI刷新。
  • UI描述:以声明式的方式来描述UI的结构,例如build()方法中的代码块。
  • 自定义组件:可复用的UI单元,可组合其他组件,如上述被@Component装饰的struct Hello。
  • 系统组件:ArkUI框架中默认内置的基础和容器组件,可直接被开发者调用,比如示例中的Column、Text、Divider、Button。
  • 属性方法:组件可以通过链式调用配置多项属性,如fontSize()、width()、height()、backgroundColor()等。
  • 事件方法:组件可以通过链式调用设置多个事件的响应逻辑,如跟随在Button后面的onClick()。

有点类似于,构建了一个页面,在页面里面顺序堆控件,最后形成一个完整的界面,其中会涉及到状态更新刷新界面的问题,在Android中可使用Handler来更新UI,在ArkTS中可以通过状态管理和渲染控制来操作。

状态管理概述:如果希望构建一个动态的、有交互的界面,就需要引入“状态”的概念。
渲染控制概述:ArkUI通过自定义组件的build()函数和@builder装饰器中的声明式UI描述语句构建相应的UI。在声明式描述语句中开发者除了使用系统组件外,还可以使用渲染控制语句辅助UI的构建,这些渲染控制语句包括控制组件是否显示的条件渲染语句,基于数组数据快速生成组件的循环渲染语句以及针对大数据量场景的数据懒加载语句。

渲染控制、状态管理这些东西还是有点复杂的,因为涉及到抽象的东西,不容易通过文字就能理解,我们先理解大致的概念,然后再通过实践去深入认识它们。

4、开发一个登录界面

基于API9进行开发,创建一个Login页面,并跳转到首页。
在pages目录下创建一个Login.ets文件。

import prompt from '@ohos.promptAction'
import router from '@ohos.router'

@Entry
@Component
struct Login {
  userNameText: string = ""
  userPsdText: string = ""

  build() {
    Row() {
      Column() {

        TextInput({ placeholder: "请输入账号" })
          .type(InputType.Normal)
          .width('100%')
          .fontSize(16)
          .maxLength(20)
          .height(45)
          .onChange(text => {
            this.userNameText = text
          })

        TextInput({ placeholder: "请输入密码" })
          .type(InputType.Password)
          .width('100%')
          .fontSize(16)
          .maxLength(20)
          .height(45)
          .margin({ top: 16 })
          .onSubmit((enterKey) => {

            if (enterKey == EnterKeyType.Go) {
              prompt.showToast({ message: "点击GO", duration: 2000 })
              //跳转到登录
            } else if (enterKey == EnterKeyType.Done) {
              prompt.showToast({ message: "点击DONE", duration: 2000 })
            }

          })
          .onChange(text => {
            this.userPsdText = text
          })

        Button("登录", { stateEffect: true })
          .width('100%')
          .margin({ top: 32, left: 16, right: 16 })
          .padding({ left: 16, right: 16, top: 10, bottom: 10 })
          .onClick(() => {
            if (this.userNameText.trim() == "") {
              prompt.showToast({ message: "请输入账号", duration: 2000 })
              return
            }
            if (this.userPsdText.trim() == "") {
              prompt.showToast({ message: "请输入密码", duration: 2000 })
              return
            }
            
            prompt.showToast({ message: "登录成功,跳转到首页", duration: 2000 })
            router.pushUrl({
              url: 'pages/Index'
            })
          })
      }.height('100%').width('100%').padding({ left: 16, right: 16 }).justifyContent(FlexAlign.Center)
    }
  }
}

显示结果如下:
在这里插入图片描述
运行之前还需要修改一下这两个地方,不然可能运行失败,如下图所示:
在这里插入图片描述
在这里插入图片描述

到此就构建了一个登录界面。

5、总结

  • 写法和Flutter真的太像了,所以,有Flutter的基础写起来更容易一些;
  • Let和var两个关键字貌似不需要用到也可以;
  • 链式调用格式化,看起来不是很完美,不晓得能否调整。

未知的一切,还在探索中。

6、参考文档

鸿蒙开发文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/start-overview-0000001478061421-V2






原创不易,求个关注。

在这里插入图片描述

微信公众号:一粒尘埃的漫旅
里面有很多想对大家说的话,就像和朋友聊聊天。
写代码,做设计,聊生活,聊工作,聊职场。
我见到的世界是什么样子的?
搜索关注我吧。

公众号与博客的内容不同。

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

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

相关文章

SCI期刊投稿的不同状态

投稿过程中的不同状态代表了稿件的不同处理阶段 1. Submitted to Journal 已提交至期刊 刚投稿成功&#xff0c;邮箱会收到确认信件&#xff0c;等待编辑处理稿件&#xff0c;这个状态自然形成&#xff0c;无需作者处理。 2. Awaiting admin processing 等待管理员处理 文…

面对同行恶意排挤,佳卫苗灭杀病毒HPV向市场发出灵魂五问

近期&#xff0c;抗HPV市场因为一款名叫“佳卫苗灭杀病毒HPV”的产品诞生而风起云涌。上市之初&#xff0c;产品方便表示&#xff0c;佳卫苗灭杀病毒HPV的诞生&#xff0c;不仅是为了造福患者&#xff0c;更是为了优化市场、刺激行业升级&#xff0c;以“机理更科学、材料更先进…

Windows进程机制

进程 进程要做任何事情&#xff0c;必须让一个线程在它的上下文运行。该线程负责执行进程地址空间包含的代码。每个进程至少要有一个线程来执行进程地址空间包含的代码。当系统创建一个进程的时候&#xff0c;会自动为进程创建第一个线程&#xff0c;这称为主线程&#xff08;…

MyBatis--07--启动过程分析、SqlSession安全问题、拦截器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 谈谈MyBatis的启动过程具体的操作过程如下&#xff1a;实现测试类,并测试SqlSessionFactorySqlSession SqlSession有数据安全问题?在MyBatis中&#xff0c;SqlSess…

可观测性是什么?新手入门指南!

如果您之前对可观测性重要性&#xff0c;益处&#xff0c;以及组成不甚了解&#xff0c;本文是一个合适的指南手册。 什么是可观测性&#xff1f; 可观测性被定义为根据系统产生的输出数据&#xff08;如日志&#xff0c;指标和链路追踪&#xff09;来衡量当前系统运行状态的…

Python虚拟环境指南:告别依赖地狱

一、背景 在SAAS&#xff08;软件即服务&#xff09;平台中&#xff0c;用户使用自行定制的Python脚本已经成为司空见惯的做法&#xff0c;然而&#xff0c;由于不同用户对Python三方库的需求各不相同&#xff0c;而底层服务器一般只安装了一个Python版本。举例来说&#xff0…

【STM32单片机】旋转太空人设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使IIC OLED液晶等。 主要功能&#xff1a; 系统运行后&#xff0c;OLED显示动画界面。 二、软件设计 /* 作者&#xff1a;嗨小易&#xff08;QQ&#x…

Stable Diffusion 系列教程 - 3 模型下载和LORA模型的小白入门

首先&#xff0c;一个比较广泛的模型下载地址为&#xff1a;Civitai Models | Discover Free Stable Diffusion Models 黄框是一些过滤器&#xff0c;比如checkpoints可以理解为比如把1.5版本的SD模型拷贝一份后交叉识别新的画风或场景后得到的模型&#xff0c;可以单独拿出来使…

[CC13X0] XDS100V3连接报错:Make sure your device is unlocked.

用XDS100V3给CC1310下载程序时&#xff0c;发现如下连接错误&#xff1a; An error occurred while hard opening the controller. -----[An error has occurred and this utility has aborted]-------------------- This error is generated by TIs USCIF driver or utilities…

mysql 数据库 关于库的基本操作

库的操作 如果想到 mysql 客户端当中数据 系统当中的命令的话&#xff0c;直接输入的话&#xff0c;会被认为是 mysql 当中的命令。 所以&#xff0c;在mysql 当中执行系统当中的命令的话&#xff0c;要在系统命令之前带上 ststem &#xff0c;表示系统命令&#xff1a; 但是…

[css] flex wrap 九宫格布局

<div class"box"><ul class"box-inner"><li>九宫格1</li><li>九宫格2</li><li>九宫格3</li><li>九宫格4</li><li>九宫格5</li><li>九宫格6</li><li>九宫格7&l…

2024年高效远程协同运维工具推荐

随着企业的不断发展以及变化&#xff0c;企业的内部IT环境也是日益复杂&#xff0c;一跨高效远程协同运维工具必不可少&#xff0c;不仅可以提高生产力&#xff0c;还能降低运营成本。这里就给大家推荐2024年高效远程协同运维工具。 高效远程协同运维工具应用场景 1、IT运维管…

WPF仿网易云搭建笔记(1):项目搭建

文章目录 前言项目地址动态样式组合样式批量样式覆盖Prism新建UserControler修改Material Design 笔刷收放列表可以滚动的StackPanel列表点击展开或折叠 实现效果 前言 今天接着继续细化代码&#xff0c;把整体框架写出来 项目地址 WPF仿网易云 Gitee仓库 动态样式 【WPF】C#…

linux 查看服务启动时间

文章目录 linux 查看服务启动时间参数解析 linux 查看服务启动时间 [root104 ~]# ps -o lstart -p ps -ef |grep -v grep |grep "zookeeper"|awk {print$2}STARTED Fri Dec 15 16:54:10 2023参数解析 linux 命令中 ps -ef 详解 ps -ef表示查看全格式的进程。 ps …

视频号小店需要缴纳保证金吗?保证金缴纳标准,不懂的快来看!

我是电商珠珠 入驻视频号小店&#xff0c;需要缴纳保证金吗&#xff1f;具体缴纳多少&#xff1f;... 这是想要入驻视频号小店的热门话题&#xff0c;今天我就来给大家一一讲明白。 想要入驻视频号小店&#xff0c;就必须要缴纳保证金。保证金是平台为了约束商家的行为&…

LLM之Agent(六)| 使用AutoGen、LangChian、RAG以及函数调用构建超级对话系统

本文我们将尝试AutoGen集成函数调用功能。函数调用最早出现在Open AI API中&#xff0c;它允许用户调用外部API来增强系统的整体功能和效率。例如&#xff0c;在对话过程中根据需要调用天气API。 函数调用和Agent有各种组合&#xff0c;在这里我们将通过函数调用调用RAG检索增强…

Windows 7如何将分区标记为活动分区?

引导分区&#xff0c;也称为引导卷&#xff0c;是包含引导加载程序和Windows操作系统所需文件的磁盘分区&#xff0c;是正常启动计算机的前提。一个正确的引导分区不只要包含相关的可引导数据&#xff0c;还需要将分区标记为活动分区。那么&#xff0c;如何将Windows 7分区标记…

网络安全——基于Snort的入侵检测实验

一、实验目的要求&#xff1a; 二、实验设备与环境&#xff1a; 三、实验原理&#xff1a; 四、实验步骤&#xff1a; 五、实验现象、结果记录及整理&#xff1a; 六、分析讨论与思考题解答&#xff1a; 七、实验截图&#xff1a; 一、实验目的要求&#xff1a; 1、掌握…

SuperMap iPortal权限介绍

作者&#xff1a;yx 文章目录 前言一、内置权限二、自定义权限&#xff08;11.1.0及以后版本&#xff09;1、修改配置文件2、页面展示3、api调用4、结果验证5、实际应用 前言 iPortal 用户访问和使用门户中资源的能力取决于其用户类型与在门户中拥有的权限&#xff0c;权限通过…

深入分析ClassLocader工作机制

文章目录 一、ClassLoader简介1. 概念2. ClassLoader类结构分析 二、ClassLoader的双亲委派机制三、Class文件的加载流程1. 简介2. 加载字节码到内存3. 验证与解析4. 初始化Class对象 四、常见加载类错误分析1. ClassNotFoundException2. NoClassDefFoundError3. UnsatisfiledL…