📋 目录
- [ArkTS 简介与环境搭建](#ArkTS 简介与环境搭建)
- 基础语法速览
- [声明式 UI 核心语法](#声明式 UI 核心语法)
- 状态管理装饰器详解
- 网络请求与数据封装
- 实战案例:音乐播放器
- 最佳实践与性能优化
1. ArkTS 简介与环境搭建
什么是 ArkTS?
ArkTS 是华为基于 TypeScript 扩展的编程语言,专为 HarmonyOS 应用开发设计。它保留了 TypeScript 的静态类型特性,同时增加了声明式 UI 和状态管理能力。
TypeScript + 鸿蒙扩展 = ArkTS
核心特性
| 特性 | 说明 |
|---|---|
| 静态类型 | 编译时类型检查,减少运行时错误 |
| 声明式 UI | 类似 React/Vue 的组件化开发模式 |
| 状态驱动 | 数据变化自动触发 UI 更新 |
| 跨设备 | 一次开发,多端部署 |
环境搭建
bash
# 1. 安装 DevEco Studio
# 下载地址:https://developer.harmonyos.com/cn/develop/deveco-studio
# 2. 创建新项目
# File → New → Create Project → Empty Ability
# 3. 项目结构
project/
├── entry/
│ ├── src/
│ │ ├── main/
│ │ │ ├── ets/
│ │ │ │ ├── pages/
│ │ │ │ ├── data/
│ │ │ │ ├──entrybackupability /
│ │ │ │ └── entryability/
│ │ │ └── resources/ # 资源文件
│ │ └── module.json5 # 模块配置
│ └── hvigorfile.ts # 构建配置
└── build-profile.json5 # 全局构建配置
2. 基础语法速览
变量声明
typescript
// ✅ 推荐:使用 let/const,明确类型
let count: number = 0;
const MAX_COUNT: number = 100;
let userName: string = 'Harmony';
let isActive: boolean = true;
// 避免:使用 var 或隐式类型
var oldStyle = '不推荐'; // 类型推断不明确
数据类型
typescript
// 基础类型
let id: number = 1001;
let title: string = "晴天";
let isLiked: boolean = true;
// 数组
let scores: number[] = [90, 85, 88];
let names: Array<string> = ['周杰伦', '陈奕迅'];
// 对象
interface Song {
id: number;
title: string;
artist: string;
duration: number;
}
let song: Song = {
id: 1001,
title: "晴天",
artist: "周杰伦",
duration: 269
};
// 联合类型
let status: 'loading' | 'success' | 'error' = 'loading';
// 可选属性
interface User {
name: string;
age?: number; // 可选
email?: string;
}
函数定义
typescript
// 普通函数
function add(a: number, b: number): number {
return a + b;
}
// 箭头函数
const multiply = (a: number, b: number): number => a * b;
// 异步函数
async function fetchSongs(): Promise<Song[]> {
const response = await http.get('/songs');
return response.data;
}
// 默认参数
function greet(name: string = 'Guest'): string {
return `Hello, ${name}`;
}
// 剩余参数
function sum(...numbers: number[]): number {
return numbers.reduce((acc, cur) => acc + cur, 0);
}
条件与循环
typescript
// if-else
if (score >= 90) {
console.info('优秀');
} else if (score >= 60) {
console.info('及格');
} else {
console.info('不及格');
}
// for 循环
for (let i = 0; i < 10; i++) {
console.info(i);
}
// for...of(推荐遍历数组)
for (const song of songList) {
console.info(song.title);
}
// for...in(遍历对象键)
for (const key in user) {
console.info(`${key}: ${user[key]}`);
}
// while 循环
while (count < MAX_COUNT) {
count++;
}
3. 声明式 UI 核心语法
组件结构
typescript
@Entry
@Component
struct Index {
build() {
Column() {
Text('Hello HarmonyOS')
.fontSize(24)
.fontWeight(FontWeight.Bold)
}
.width('100%')
.height('100%')
}
}
常用布局组件
typescript
// Column - 垂直布局
Column({ space: 10 }) {
Text('顶部')
Text('中间')
Text('底部')
}
// Row - 水平布局
Row({ space: 10 }) {
Image($r('app.media.icon'))
Text('标题')
Text('副标题')
}
// Stack - 层叠布局
Stack() {
Image($r('app.media.background'))
Text('覆盖文字')
.position({ x: 20, y: 20 })
}
// Flex - 弹性布局
Flex({ justifyContent: FlexAlign.SpaceBetween, alignItems: ItemAlign.Center }) {
Text('左')
Text('中')
Text('右')
}
// List - 列表
List({ space: 10 }) {
ForEach(items, (item) => {
ListItem() {
Text(item.title)
}
}, (item) => item.id.toString())
}
// Grid - 网格
Grid() {
ForEach(items, (item) => {
GridItem() {
Text(item.title)
}
})
}
通用属性
typescript
Text('示例文本')
// 尺寸
.width('100%')
.height(50)
.minWidth(100)
.maxHeight(200)
// 边距
.margin(10)
.margin({ top: 10, bottom: 20 })
.padding(15)
// 样式
.fontSize(16)
.fontWeight(FontWeight.Medium)
.fontColor('#333333')
.backgroundColor('#FFFFFF')
// 边框
.borderWidth(1)
.borderColor('#CCCCCC')
.borderRadius(8)
// 阴影
.shadow({
radius: 10,
color: 'rgba(0, 0, 0, 0.1)',
offsetX: 0,
offsetY: 5
})
// 透明度
.opacity(0.8)
// 可见性
.visibility(Visibility.Visible) // 或 Hidden/None
// 布局权重
.layoutWeight(1)
// 对齐
.textAlign(TextAlign.Center)
.alignItems(VerticalAlign.Center)
事件处理
typescript
@Entry
@Component
struct EventDemo {
@State count: number = 0;
build() {
Column() {
Text(`点击次数:${this.count}`)
.fontSize(20)
Button('点击我')
.onClick(() => {
this.count++;
})
// 触摸事件
Row()
.onTouch((event: TouchEvent) => {
console.info(`触摸类型:${event.type}`);
})
// 手势
GestureGroup(GestureMode.Parallel) {
ClickGesture()
.onClick(() => console.info('点击'))
LongPressGesture()
.onAction(() => console.info('长按'))
}
}
}
}
4. 状态管理装饰器详解
@State - 组件内状态
typescript
@Component
struct Counter {
@State count: number = 0;
build() {
Column() {
Text(`${this.count}`)
Button('增加')
.onClick(() => this.count++)
}
}
}
@Prop - 父传子(单向)
typescript
// 子组件
@Component
struct Child {
@Prop title: string = ''; // 父组件传入,子组件可修改但不影响父组件
build() {
Text(this.title)
}
}
// 父组件
@Entry
@Component
struct Parent {
@State parentTitle: string = '父组件标题';
build() {
Column() {
Child({ title: this.parentTitle })
Button('修改')
.onClick(() => this.parentTitle = '新标题')
}
}
}
@Link - 父子双向绑定
typescript
// 子组件
@Component
struct Child {
@Link count: number; // 与父组件双向绑定
build() {
Button(`${this.count}`)
.onClick(() => this.count++) // 会影响父组件
}
}
// 父组件
@Entry
@Component
struct Parent {
@State parentCount: number = 0;
build() {
Column() {
Text(`父组件:${this.parentCount}`)
Child({ count: $parentCount }) // 使用 $ 符号绑定
}
}
}
@Provide / @Consume - 跨代传递
typescript
// 祖先组件
@Component
struct Ancestor {
@Provide themeColor: string = '#007DFF';
build() {
Column() {
Descendant()
}
}
}
// 后代组件(任意层级)
@Component
struct Descendant {
@Consume themeColor: string = '';
build() {
Text('主题色')
.fontColor(this.themeColor)
}
}
@Observed / @ObjectLink - 对象属性观察
typescript
@Observed
class Song {
@ObjectLink title: string;
@ObjectLink isLiked: boolean;
constructor(title: string, isLiked: boolean) {
this.title = title;
this.isLiked = isLiked;
}
}
@Component
struct SongItem {
@ObjectLink song: Song;
build() {
Row() {
Text(this.song.title)
Button(this.song.isLiked ? '❤️' : '🤍')
.onClick(() => this.song.isLiked = !this.song.isLiked)
}
}
}
@Builder - 自定义构建函数
typescript
@Component
struct CustomBuilder {
@State items: string[] = ['A', 'B', 'C'];
@Builder
ItemBuilder(item: string, index: number) {
Row() {
Text(`${index + 1}. ${item}`)
.fontSize(16)
}
.padding(10)
.backgroundColor('#FFFFFF')
}
build() {
Column() {
ForEach(this.items, (item, index) => {
this.ItemBuilder(item, index)
})
}
}
}
@Styles - 复用样式
typescript
@Component
struct StyleDemo {
@Styles
commonTextStyle() {
.fontSize(16)
.fontColor('#333333')
.padding(10)
}
@Styles
cardStyle() {
.backgroundColor('#FFFFFF')
.borderRadius(12)
.shadow({ radius: 10, color: 'rgba(0,0,0,0.1)' })
}
build() {
Column() {
Text('标题')
.commonTextStyle()
Row()
.cardStyle()
.padding(20)
}
}
}
5. 网络请求与数据封装
Http 工具类封装
typescript
import http from '@ohos.net.http';
export class HttpUtil {
private baseURL: string = 'https://api.example.com';
private timeout: number = 10000;
async get<T>(url: string, params?: Record<string, any>): Promise<T> {
const queryString = params ? '?' + Object.entries(params)
.map(([k, v]) => `${k}=${v}`)
.join('&') : '';
return this.request<T>(`${url}${queryString}`, 'GET');
}
async post<T>(url: string, data?: any): Promise<T> {
return this.request<T>(url, 'POST', data);
}
private async request<T>(url: string, method: string, data?: any): Promise<T> {
const httpRequest = http.createHttp();
return new Promise((resolve, reject) => {
httpRequest.request(
`${this.baseURL}${url}`,
{
method: method as http.HttpMethod,
header: { 'Content-Type': 'application/json' },
extraData: data,
timeout: this.timeout
},
(err: Error, response: http.HttpResponse) => {
if (err) {
reject(err);
} else {
resolve(JSON.parse(response.result as string));
}
httpRequest.destroy();
}
);
});
}
}
export const httpUtil = new HttpUtil();
数据模型定义
typescript
export interface SongItemType {
img: string
name: string
author: string
url: string
id:string
}

Mock 数据模拟
typescript
songs: SongItemType[] = [
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/0.jpg',
name: '直到世界的尽头',
author: 'WANDS',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/0.m4a',
id: '0000'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/1.jpg',
name: '画',
author: '赵磊',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/1.mp3',
id: '0001'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/2.jpg',
name: 'Sweet Dreams',
author: 'TPaul Sax / Eurythmics',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/2.mp3',
id: '0002'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/3.jpg',
name: '奢香夫人',
author: '凤凰传奇',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/3.m4a',
id: '0003'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/4.jpg',
name: '空心',
author: '光泽',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/4.mp3',
id: '0004'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/5.jpg',
name: '反转地球',
author: '潘玮柏',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/5.mp3',
id: '0005'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/6.jpg',
name: 'No.9',
author: 'T-ara',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/6.m4a',
id: '0006'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/7.jpg',
name: '孤独',
author: 'G.E.M.邓紫棋',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/7.m4a',
id: '0007'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/8.jpg',
name: 'Lose Control',
author: 'Hedley',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/8.m4a',
id: '0008'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/9.jpg',
name: '倩女幽魂',
author: '张国荣',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/9.m4a',
id: '0009'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/10.jpg',
name: '北京北京',
author: '汪峰',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/10.m4a',
id: '0010'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/11.jpg',
name: '苦笑',
author: '汪苏泷',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/11.mp3',
id: '0011'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/12.jpg',
name: '一生所爱',
author: '卢冠廷 / 莫文蔚',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/12.m4a',
id: '0012'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/13.jpg',
name: '月半小夜曲',
author: '李克勤',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/13.mp3',
id: '0013'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/14.jpg',
name: 'Rolling in the Deep',
author: 'Adele',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/14.m4a',
id: '0014'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/15.jpg',
name: '海阔天空',
author: 'Beyond',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/15.m4a',
id: '0015'
}
]
6. 实战案例:音乐播放器
完整页面代码
typescript
import { SongItemType } from "../models/music"
@ComponentV2
export struct Find {
songs: SongItemType[] = [
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/0.jpg',
name: '直到世界的尽头',
author: 'WANDS',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/0.m4a',
id: '0000'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/1.jpg',
name: '画',
author: '赵磊',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/1.mp3',
id: '0001'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/2.jpg',
name: 'Sweet Dreams',
author: 'TPaul Sax / Eurythmics',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/2.mp3',
id: '0002'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/3.jpg',
name: '奢香夫人',
author: '凤凰传奇',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/3.m4a',
id: '0003'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/4.jpg',
name: '空心',
author: '光泽',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/4.mp3',
id: '0004'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/5.jpg',
name: '反转地球',
author: '潘玮柏',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/5.mp3',
id: '0005'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/6.jpg',
name: 'No.9',
author: 'T-ara',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/6.m4a',
id: '0006'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/7.jpg',
name: '孤独',
author: 'G.E.M.邓紫棋',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/7.m4a',
id: '0007'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/8.jpg',
name: 'Lose Control',
author: 'Hedley',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/8.m4a',
id: '0008'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/9.jpg',
name: '倩女幽魂',
author: '张国荣',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/9.m4a',
id: '0009'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/10.jpg',
name: '北京北京',
author: '汪峰',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/10.m4a',
id: '0010'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/11.jpg',
name: '苦笑',
author: '汪苏泷',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/11.mp3',
id: '0011'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/12.jpg',
name: '一生所爱',
author: '卢冠廷 / 莫文蔚',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/12.m4a',
id: '0012'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/13.jpg',
name: '月半小夜曲',
author: '李克勤',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/13.mp3',
id: '0013'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/14.jpg',
name: 'Rolling in the Deep',
author: 'Adele',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/14.m4a',
id: '0014'
},
{
img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/15.jpg',
name: '海阔天空',
author: 'Beyond',
url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/15.m4a',
id: '0015'
}
]
build() {
Column() {
Text('猜你喜欢')
.fontColor('#fff')
.width('100%')
.margin({ bottom: 10 })
List() {
ForEach(this.songs, (item: SongItemType, index: number) => {
ListItem() {
Row() {
// 图
Stack() {
Image(item.img)
.width(80)
.border({ radius: 8 })
.margin({ right: 10 })
}
// 字
Column() {
Text(item.name)
.fontColor('#F3F3F3')
.width('100%')
.fontWeight(700)
.margin({ bottom: 15 })
Row() {
Text('VIP')
.fontColor('#9A8E28')
.border({ width: 1, color: '#9A8E28', radius: 12 })
.padding({
left: 5,
right: 5,
top: 3,
bottom: 3
})
.margin({ right: 10 })
Text(item.author)
.fontColor('#696969')
}
.width('100%')
}
.layoutWeight(1)
// 更多
Image($r('app.media.ic_more'))
.width(24)
.fillColor('#FEFEFE')
}
.width('100%')
.height(80)
// .backgroundColor(Color.Pink)
.margin({ bottom: 10 })
}
})
}
.scrollBar(BarState.Off)
}
.width('100%')
.height('100%')
.backgroundColor('#131313')
.padding({ left: 10, right: 10 })
// 扩充组件安全区域
.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
}
}
效果预览

注意:有关照片可以自己设置。
7. 最佳实践与性能优化
代码规范
typescript
// ✅ 推荐
@Entry
@Component
struct MusicPlayer {
@State songList: SongItem[] = [];
private readonly MAX_COUNT = 100;
aboutToAppear() {
this.initData();
}
private async initData(): Promise<void> {
// ...
}
}
// ❌ 避免
var count = 0; // 使用 let/const
function test() {} // 使用箭头函数或类方法
性能优化技巧
typescript
// 1. 使用 ForEach 时提供稳定 key
ForEach(items, (item) => {
ListItem() { Text(item.title) }
}, (item) => item.id.toString()); // ✅ 使用唯一 ID
// 2. 避免在 build 中执行复杂计算
@State computedValue: number = 0;
aboutToAppear() {
this.computedValue = this.expensiveCalculation(); // ✅ 在生命周期中计算
}
// 3. 使用 @Builder 复用 UI
@Builder
ItemTemplate(item: Item) {
// 复用逻辑
}
// 4. 懒加载长列表
List({ space: 10 }) {
ForEach(this.items, (item) => {
ListItem() {
// 按需加载内容
}
})
}
.onReachEnd(() => this.loadMore()); // 分页加载
// 5. 避免不必要的状态更新
@State count: number = 0;
increment() {
if (this.count < MAX) {
this.count++; // ✅ 条件更新
}
}
调试技巧
typescript
// 1. 使用 console 输出
console.info('普通日志');
console.warn('警告信息');
console.error('错误信息');
// 2. 条件日志
const DEBUG = true;
if (DEBUG) {
console.info('调试信息:', data);
}
// 3. 使用 DevEco Studio 调试器
// - 设置断点
// - 查看变量
// - 单步执行
// 4. 性能监控
@Builder
OptimizedBuilder(data: Data) {
const start = Date.now();
// UI 构建逻辑
const end = Date.now();
console.info(`构建耗时: ${end - start}ms`);
}
常见问题排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
| UI 不更新 | 状态变量未用 @State | 添加 @State 装饰器 |
| 类型错误 | 类型定义不匹配 | 检查接口定义 |
| 内存泄漏 | 未销毁监听器 | 在 aboutToDisappear 中清理 |
| 列表卡顿 | 数据量过大 | 使用分页 + 懒加载 |
| 网络请求失败 | 权限未配置 | 检查 module.json5 网络权限 |
📚 学习资源
官方文档
社区资源
- 开源参考项目:
- Gitee: 黑马云音乐鸿蒙版
- GitCode: NutPi 鸿蒙音乐
- 官方文档:HarmonyOS Developer Docs
推荐工具
- DevEco Studio - 官方 IDE
- ArkTS Linter - 代码检查工具
- Previewer - 实时预览工具