鸿蒙全栈开发 D2
课程目标
- 掌握ArkTS基础语法与核心概念
- 理解声明式UI开发范式
- 能独立开发简单鸿蒙应用组件
- 建立规范的代码编写习惯
第一部分:初识ArkTS
1.1 语言全景认知
关键特征解析:
- 类型安全:编译时检查错误(演示类型错误案例)
- UI即代码:通过代码直接描述界面(对比传统XML布局)
- 一次开发:同一套代码适配不同设备尺寸
1.2 开发环境初体验
DevEco Studio安装四步曲:
- 下载安装包(官网/镜像站)
- 基础配置检查:
- JDK 17+
- 8GB+可用空间
- 创建第一个项目:
Project Type: Application Template: Empty Ability Project Name: HelloArkTS - 模拟器启动测试(P40手机模拟器)
第二部分:基础语法全解析
2.1 变量与基础类型
变量声明三板斧:
// 方式1:显式类型声明
let userName: string = "Alice";// 方式2:类型推断(推荐)
let age = 20; // 自动识别为number// 方式3:联合类型
let id: string | number = "S001";
id = 1001; // 有效赋值
基础类型速查表:
| 类型 | 示例 | 特殊值 |
|---|---|---|
number | 3.14, -20, NaN | Infinity |
string | "Hello", `年龄:${age}` | 模板字符串 |
boolean | true/false | - |
any | 禁用! | 类型检测逃逸 |
2.2 运算符与流程控制
新手指南:
// 算术运算符
let result = 10 + 5 * 3; // 25// 比较运算符
if (age >= 18 && age <= 60) {console.log("成年人");
}// 空值处理
let nickname = userName ?? "匿名用户"; // 空值合并运算符
循环结构对比:
// 传统for循环
for (let i = 0; i < 5; i++) {console.log(i);
}// forEach遍历数组
[1,2,3].forEach(num => console.log(num));// for...of迭代
for (const num of [1,2,3]) {console.log(num);
}
2.3 函数与作用域
函数定义三要素:
// 1. 基础函数
function add(a: number, b: number): number {return a + b;
}// 2. 箭头函数(推荐)
const sayHello = (name: string): string => `你好,${name}!`;// 3. 默认参数
function createUser(name: string, age: number = 18) {// 函数体
}// 函数调用示例
console.log(sayHello("张三")); // 输出:你好,张三!
作用域陷阱演示:
let globalVar = 10;function testScope() {let localVar = 20;console.log(globalVar); // 10console.log(localVar); // 20
}
// console.log(localVar); // 报错:未定义
**第三部分:面向对象编程
3.1 类与对象基础
类结构四要素:
class Student {// 1. 属性声明private id: string; public name: string;// 2. 构造函数constructor(name: string, id: string) {this.name = name;this.id = id;}// 3. 方法定义study(subject: string): void {console.log(`${this.name}正在学习${subject}`);}// 4. 访问器get studentId(): string {return this.id;}
}// 使用示例
const stu1 = new Student("李华", "S2023001");
stu1.study("ArkTS编程"); // 输出:李华正在学习ArkTS编程
3.2 继承与多态
class CollegeStudent extends Student {major: string;constructor(name: string, id: string, major: string) {super(name, id);this.major = major;}// 方法重写study(): void {console.log(`${this.name}主修${this.major}`);}
}const stu2 = new CollegeStudent("王芳", "S2023002", "计算机科学");
stu2.study(); // 输出:王芳主修计算机科学
类关系图示:
第四部分:ArkTS UI开发
4.1 声明式UI入门
组件三要素:
@Entry
@Component
struct WelcomePage {// 1. 状态变量@State counter: number = 0;// 2. 构建方法build() {// 3. UI描述Column() {Text(`点击次数:${this.counter}`).fontSize(24).fontColor(Color.Blue)Button("点我增加").onClick(() => {this.counter++;})}.width('100%').padding(20)}
}
布局属性速记:
| 属性 | 说明 | 示例 |
|---|---|---|
.width() | 宽度设置 | .width('50%') |
.height() | 高度设置 | .height(200) |
.margin() | 外边距 | .margin({top:10}) |
.padding() | 内边距 | .padding(20) |
.border() | 边框 | .border({width:1}) |
4.2 常用组件库
基础组件三剑客:
Column() { // 垂直布局Text("用户信息").fontSize(20)TextInput().placeholder("请输入姓名").onChange(text => {console.log(text);})Button("提交").onClick(() => {// 处理点击事件})
}
条件渲染示例:
@State isLogged: boolean = false;build() {Column() {if (this.isLogged) {Text("欢迎回来!")} else {Button("立即登录")}}
}
第五部分:实战训练
5.1 课堂练习:个人名片组件
@Entry
@Component
struct ProfileCard {@State name: string = "张三";@State age: number = 20;@State isStudent: boolean = true;build() {Column() {Text("个人名片").fontSize(24).fontWeight(FontWeight.Bold)Divider()Row() {Text("姓名:")Text(this.name)}Row() {Text("年龄:")Text(this.age.toString())}Button(this.isStudent ? "学生" : "非学生").onClick(() => {this.isStudent = !this.isStudent;})}.padding(20)}
}
5.2 作业:计算器原型
需求说明:
- 实现加减乘除基础运算
- 显示计算历史记录
- 支持清零功能
核心代码提示:
@State result: number = 0;
@State history: string[] = [];build() {Column() {Text(`当前结果:${this.result}`)Row() {Button("+1").onClick(() => this.calculate('+', 1))Button("-1").onClick(() => this.calculate('-', 1))Button("×2").onClick(() => this.calculate('*', 2))Button("÷2").onClick(() => this.calculate('/', 2))}ForEach(this.history, item => {Text(item)})}
}private calculate(op: string, num: number) {// 实现计算逻辑
}
1. 课堂速查表:
- [ArkTS基础语法速查表.pdf]
- [DevEco Studio快捷键指南.png]
2. 开发资源导航:
- 官方文档:https://developer.harmonyos.com
- 代码示例库:https://gitee.com/openharmony/applications_app_samples
3. 常见问题锦囊:
Q1:为什么修改了变量但界面不更新?
A:确保使用@State装饰器,且通过=赋值触发更新 Q2:如何调试ArkTS程序?
- 使用console.log()输出日志
- 在DevEco Studio中使用断点调试 Q3:遇到类型错误怎么办?
- 检查变量类型声明
- 使用类型断言:value as string
课程进度建议
| 课时 | 内容 | 重点 |
|---|---|---|
| 1 | 环境搭建与基础语法 | 变量/函数/流程控制 |
| 2 | 面向对象编程 | 类/继承/接口 |
| 3 | UI开发基础 | 声明式语法/组件通信 |
| 4 | 综合项目实践 | 状态管理/组件化开发 |
import { Student } from '../common/Student';@Entry
@Component
struct Index {@State message: string = 'Hello World';build() {Column(){Button("数字类型").onClick(()=>{let n1: number = 10let n2: number = 43.5let n3 = n1+n2console.log("ken",n3)let b1: number = 0o17//八进制15let b2: number = 0x17//十六进制23let b3: number = 0b11//二进制3console.log("ken",b1,b2,b3)}).height('10%').width('50%')Button("计算结果").onClick(()=>{let result = 10 + 5 * 3;console.log("ken",result)}).height('10%').width('50%')Button("函数测试").onClick(()=>{console.log("ken",sayHello("张三"))console.log("ken",add(1,2))createUser()})Button("对象测试").onClick(()=>{let stu = new Student("xxx","18")stu.study("ken"+"鸿蒙开发")}).height('10%').width('50%')}}
}
// 1. 基础函数
function add(a: number, b: number): number {return a + b;
}// 2. 箭头函数(推荐)
const sayHello = (name: string): string => `你好,${name}!`;// 3. 默认参数
function createUser(name: string = "yx", age: number =18) {console.log("ken",name + age)// 函数体
}
相关文章:
鸿蒙全栈开发 D2
课程目标 掌握ArkTS基础语法与核心概念理解声明式UI开发范式能独立开发简单鸿蒙应用组件建立规范的代码编写习惯 第一部分:初识ArkTS 1.1 语言全景认知 #mermaid-svg-V5mnjQN3DAHkfoBo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size…...
下载PyCharm 2024.3.4 (Community Edition)来开发测试python
1、下载PyCharm 2024.3.4 (Community Edition) 如果你使用的是联想电脑,可以直接在联想应用商店里下载,这样比较省事。 如果你使用的不是联想电脑,当然也可能是别的应用商店里下载。 也可以直接在官网下载: 下载 PyCharm&…...
C#调用Ni板卡进行实现采集任务(模拟量输入输出)示例2
C#调用Ni板卡进行实现采集任务(模拟量输入输出)示例2 本文介绍如何使用C#控制Ni的USB-6008板卡进行模拟量输入、模拟量输出、输出量输入、数字量输出。本例通过新建一个类USB_6008的类进行功能封装:即把模拟量的读取以及模拟量的输出进行了封装。代码详见: https://download…...
01-二分-查找(洛谷)
链接: P2249 【深基13.例1】查找 - 洛谷 题目 思路 没啥好说的,就是二分的模板要熟练掌握;详细参考代码随想录 本道题要注意的就是不能直接套模板,因为有重复元素,所以要单独处理一下边界。 代码 #include<bi…...
linux发送邮件结合cron
Linux发送邮件结合cron定时任务 配置邮件发送(以QQ邮箱为例,其他同理) 一、获取qq邮箱授权码 登录qq邮箱 进行手机验证或者令牌啥的会获取到一个授权码 二、使用mailx发邮件 安装软件 yum -y install mailx编辑配置文件 vim /etc/mail…...
C语言基础2
一、变量的作用域 局部变量的作用域是变量所在的局部范围,全局变量的作用域是整个工程。 int main() { { int a 10; printf("a %d\n", a); } printf("a %d\n", a); //报错位置 return 0; } 这里会发生报错: “a”: 未声明的…...
Linux系统上安装kafka
目录 1. 安装Java环境 2. 下载和解压Kafka 3. 配置Kafka 4. 启动ZooKeeper和Kafka 5. 测试Kafka 6. 停止服务 7.常见问题 1. 安装Java环境 Kafka依赖Java运行环境(JDK 8或更高版本): # 安装OpenJDK(推荐) yum…...
09 HarmonyOS NEXT 仿uv-ui Tag组件开发教程系列(三)
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! 文章目录 Tag组件实战应用与最佳实践1. 复杂场景应用1.1 标签筛选系统 2. 性能优化实践2.1 状态管理优化2.2 渲染性能优化 3. 实用功能扩展3.1 拖拽…...
【每日学点HarmonyOS Next知识】网页Scheme拉起应用、列表刷新、Web下载文件、根据子元素
1、HarmonyOS 目前 app 中是否支持网页Scheme拉起应用? 支持deeplink的,网页中添加按钮引导用户拉起应用。网页端直接提示打开应用按钮绑定点击事件window.open(tzptest://www.xxxxx.com?urlXXX)>,点击该按钮,打开网页web端收到的url为t…...
如何排查MySQL是否走索引
博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...
AF3 curry1函数解读
AlphaFold3 data_transforms 模块的 curry1 函数实现了一个经典的柯里化 (currying) 技术,具体是固定函数 f 的所有参数,除了第一个参数。换句话说,curry1 允许你在调用函数时,先提供除了第一个参数之外的所有参数,然后返回一个新的函数,这个新函数只等待第一个参数。 …...
摄像头应用编程(三):多平面视频采集
文章目录 1、前言2、环境介绍3、步骤4、应用程序编写5、测试5.1、编译应用程序5.2、运行应用程序 6、总结 1、前言 在查看摄像头类型时,大致可以分为两类:Video Capture 和 Video Capture Multiplanar。 本次应用程序主要针对类型为Video Capture Multi…...
【GoTeams】-2:项目基础搭建(下)
本文目录 1. 回顾2. Zap日志3. 配置4. 引入gprc梳理gRPC思路优雅关闭gRPC 1. 回顾 上篇文章我们进行了路由搭建,引入了redis,现在来看看对应的效果。 首先先把前端跑起来,然后点击注册获取验证码。 再看看控制台输出和redis是否已经有记录&…...
02-双指针-A-B 数对
题目 链接:P1102 A-B 数对 - 洛谷 思路 问题场景想象 我们可以把这个问题想象成在一个排队的队伍里找符合特定身高差的人对。给定的数列里的每个数就好比队伍里每个人的身高,而差值 C 就是我们要找的身高差。我们的目标是找出队伍里所有身高差恰好是 …...
2025年Cursor最新安装使用教程
Cursor安装教程 一、Cursor下载二、Cursor安装三、Cursor编辑器快捷键(1) 基础编辑快捷键(2) 导航快捷键(3) 其他常用快捷键 一、Cursor下载 Cursor官方网站(https://www.cursor.com/ ) 根据自己电脑操作系统选择对应安装包 二、Cursor安装 下载完成后…...
Modbus TCP/IP 与 RS-485 接口的兼容性
Modbus TCP/IP 和 RS-485 接口的 直接兼容性 不存在,因为两者分属不同的网络层次(TCP/IP 基于以太网,RS-485 是物理层接口),但通过 协议转换和网络架构设计 可以实现互联互通。以下是详细的技术解析与实现方案: 一、协议差异对比 特性Modbus TCP/IPModbus RTU(RS-485)物…...
快速部署:在虚拟机上安装 CentOS 7 的详细步骤
CentOS是一个开源的基于Red Hat Enterprise Linux (RHEL) 的Linux发行版,它的主要目的是提供一个与RHEL相似的操作系统但不包含RHEL的商业支持和服务,完全免费。主要面向那些希望在企业环境中使用稳定、可靠的Linux系统但又不想支付RHEL许可证费用的用户…...
better-sqlite3之exec方法
在 better-sqlite3 中,.exec() 方法用于执行包含多个 SQL 语句的字符串。与预编译语句相比,这种方法性能较差且安全性较低,但有时它是必要的,特别是当你需要从外部文件(如 SQL 脚本)中执行多个 SQL 语句时。…...
NDT 代价函数
SLAM 中的 NDT 代价函数 在SLAM(同步定位与地图构建)中,NDT(Normal Distributions Transform)是一种常用的点云配准方法。NDT代价函数用于评估点云配准的质量。以下是NDT代价函数的详细介绍: NDT 代价函数…...
【有啥问啥】深入浅出:大模型应用工具 Ollama 技术详解
深入浅出:大模型应用工具 Ollama 技术详解 引言 近年来,大型模型(Large Models,LLMs)技术突飞猛进,在自然语言处理、计算机视觉、语音识别等领域展现出强大的能力。然而,部署和运行这些庞大的…...
【AI训练】如何提高LLM的训练速度
提高大型语言模型(LLM)的训练速度需要从算法优化、硬件加速、软件框架和基础设施等多个层面综合考虑。以下是一些关键方法,按类别分类说明: --- 一、硬件优化 1. 分布式训练 - 数据并行(Data Parallelism)…...
利用opencv_python(pdf2image、poppler)将pdf每页转为图片
1、安装依赖pdf2image pip install pdf2image 运行.py报错,因为缺少了poppler支持。 2、安装pdf2image的依赖poppler 以上命令直接报错。 改为手工下载: github: Releases oschwartz10612/poppler-windows GitHub 百度网盘: 百度网盘…...
大数据测试总结
总结测试要点: 参考产品文档,技术文档梳理以下内容 需求来源 业务方应用场景 数据源,数据格转,数据产出,数据呈现方式(数据消亡史),数据量级(增量,全量&am…...
pytorch高可用的设计策略和集成放大各自功能
在使用 PyTorch 编写模型时,为确保模型具备高可用性,可从模型设计、代码质量、训练过程、部署等多个方面采取相应的方法,以下为你详细介绍: 模型设计层面 模块化设计 实现方式:将模型拆分成多个小的、独立的模块,每个模块负责特定的功能。例如,在一个图像分类模型中,可…...
容器 /dev/shm 泄漏学习
容器 /dev/shm 泄漏的介绍 在容器环境中,/dev/shm 是一个基于 tmpfs 的共享内存文件系统,通常用于进程间通信(IPC)和临时数据存储。由于其内存特性,/dev/shm 的大小是有限的,默认情况下 Docker 容器的 /de…...
Redis面试常见问题——集群方案
Redis集群方案 在Redis中提供的集群方案总共有三种 主从复制 哨兵模式 分片集群 主从复制 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从数据同步原理 单节点Redis的并发能力是有…...
企业级Python后端数据库使用指南(简略版)
总述 企业级应用通常需要考虑扩展性、安全性、性能等因素。数据库的使用也不例外。连接数据库的第一步应该是建立连接,但企业环境中可能不会每次操作都新建连接,而是使用连接池来管理,这样可以提高效率,减少资源消耗。例如&#x…...
Qt:day4
一、作业 1:实现绘图的时候,颜色的随时调整; 2:追加橡皮擦功能; 3:配合键盘事件,实现功能; 当键盘按 ctrlz 的时候,撤销最后一次绘图。 【Headers / widget.h】ÿ…...
随机播放音乐 伪随机
import java.util.*;/*** https://cloud.tencent.com.cn/developer/news/1045747* 伪随机播放音乐*/ public class MusicPlayer {private List<String> allSongs; // 所有歌曲列表private List<String> playedSongs; // 已经播放过的歌曲列表private Map<String…...
vue3之echarts仪表盘
vue3之echarts仪表盘 效果如下: 版本 "echarts": "^5.5.1" 核心代码: <template><div ref"chartRef" class"circle"></div> </template> <script lang"ts" setup>…...
