在鸿蒙开发中,API(应用程序接口)是连接开发者与系统能力的桥梁。高效掌握和使用API是提升开发效率的关键。本指南精选鸿蒙开发中最常用的高频API,提供实战解析和避坑指南,帮助开发者快速查阅、正确使用,避免常见错误。
API学习方法论:
- 理解而非记忆:重点理解API的设计思想和使用场景,而非死记硬背
- 关注参数与返回值:掌握关键参数的含义和使用限制
- 重视异常处理:了解可能的错误和异常情况
- 实战中巩固:通过实际项目使用API,加深理解和记忆
本指南使用建议:
- 按需查阅:根据开发需求快速查找相关API
- 关注避坑点:每个API的"避坑指南"部分尤为重要
- 结合示例:参考实战示例理解API使用场景
- 定期回顾:对常用API定期回顾,强化记忆
第一章:UI开发高频API
1.1 基础组件API
Text组件 - 文本显示
功能概述:
Text组件用于显示文本内容,支持字体样式、对齐方式、文本装饰等多种属性设置,是UI开发中最基础也最常用的组件之一。
核心接口:
// 基础用法
Text(content: string | Resource)
.fontSize(size: number | string) // 设置字体大小
.fontColor(color: ResourceColor) // 设置字体颜色
.fontWeight(weight: number | FontWeight) // 设置字体粗细
.textAlign(align: TextAlign) // 设置文本对齐方式
.maxLines(value: number) // 设置最大行数
.lineHeight(value: number | string) // 设置行高
.decoration(value: TextDecoration) // 设置文本装饰(下划线、删除线等)
实战解析:
- 字体大小设置:推荐使用vp单位,如
fontSize(16)表示16vp - 文本对齐:通过
textAlign控制文本水平对齐方式 - 长文本处理:结合
maxLines和textOverflow处理长文本显示 - 文本装饰:常用于链接下划线和完成状态的删除线
避坑指南️:
- ❌ 避免使用px单位设置字体大小,可能导致不同设备显示不一致
- ❌ 不要过度设置
lineHeight,可能导致文本截断或重叠 - ❌ 长文本未设置
maxLines,在小屏设备可能溢出容器 - ✅ 推荐:重要文本使用
fontWeight(FontWeight.Bold)突出显示 - ✅ 推荐:多语言文本预留足够宽度,避免文本溢出
Button组件 - 交互按钮
功能概述:
Button组件用于接收用户点击操作,支持多种样式和状态,是实现用户交互的核心组件。
核心接口:```typescript
// 基础用法
Button(label: string | Resource, options?: { type?: ButtonType, stateEffect?: boolean })
.width(value: Length) // 设置宽度
.height(value: Length) // 设置高度
.type(type: ButtonType) // 设置按钮类型
.backgroundColor(color: ResourceColor) // 设置背景颜色
.onClick(callback: () => void) // 点击事件回调
.stateEffect(value: boolean) // 是否启用状态效果
**实战解析**:
- **按钮类型**:提供Capsule(胶囊形)、Circle(圆形)和Normal(普通矩形)三种类型
- **尺寸设置**:推荐按钮高度不小于40vp,确保良好的触摸体验
- **状态效果**:`stateEffect(true)`可启用按压反馈效果
- **事件处理**:通过`onClick`处理点击事件,实现业务逻辑
**避坑指南**️:
- ❌ 避免使用过小的按钮尺寸,影响触摸体验
- ❌ 不要在按钮点击事件中执行耗时操作,会导致界面卡顿
- ❌ 避免频繁修改按钮状态,影响性能
- ✅ 推荐:重要操作按钮使用鲜明颜色,次要按钮使用浅色
- ✅ 推荐:按钮文本简洁明了,使用动词开头(如"保存"、"提交")
### 1.2 布局容器API
**Column/Row - 线性布局**
**功能概述**:
Column(垂直布局)和Row(水平布局)是最基础的线性布局容器,用于按垂直或水平方向排列子组件。
**核心接口**:
```typescript
// Column垂直布局
Column(options?: { space?: number | string })
.width(value: Length) // 设置宽度
.height(value: Length) // 设置高度
.padding(value: Length | EdgeInsets) // 设置内边距
.margin(value: Length | EdgeInsets) // 设置外边距
.space(value: Length) // 设置子组件间距
.justifyContent(value: FlexAlign) // 设置主轴对齐方式
.alignItems(value: ItemAlign) // 设置交叉轴对齐方式
// Row水平布局(接口与Column类似)
Row(options?: { space?: number | string })
.justifyContent(value: FlexAlign) // 设置主轴对齐方式
.alignItems(value: ItemAlign) // 设置交叉轴对齐方式
实战解析:
- 主轴与交叉轴:Column主轴为垂直方向,Row主轴为水平方向
- 间距设置:通过
space属性统一设置子组件间距,比单独设置margin更高效 - 对齐方式:
justifyContent控制主轴对齐,alignItems控制交叉轴对齐 - 尺寸设置:灵活使用百分比(如
width('100%'))实现自适应布局
避坑指南️:
- ❌ 避免过度嵌套Column和Row,可能导致布局性能问题
- ❌ 不要同时设置固定宽度和
width('100%'),可能导致布局异常 - ❌ 避免在Column/Row中使用过多子组件,考虑使用List替代长列表
- ✅ 推荐:使用
justifyContent(FlexAlign.SpaceBetween)实现两端对齐 - ✅ 推荐:通过
alignItems(ItemAlign.Center)实现垂直居中对齐
Flex - 弹性布局
功能概述:
Flex布局提供更灵活的子组件排列方式,支持弹性伸缩、换行等特性,适用于复杂布局场景。
核心接口:
Flex(options?: {
direction?: FlexDirection, // 布局方向
wrap?: FlexWrap, // 是否换行
justifyContent?: FlexAlign, // 主轴对齐方式
alignItems?: ItemAlign, // 交叉轴对齐方式
alignContent?: FlexAlign // 多根轴线的对齐方式
})
.width(value: Length)
.height(value: Length)
.padding(value: Length | EdgeInsets)
实战解析:
- 布局方向:通过
direction控制子组件排列方向 - 换行控制:
wrap: FlexWrap.Wrap可实现子组件自动换行 - 弹性伸缩:通过
FlexItem的flexGrow控制子组件的剩余空间分配 - 对齐控制:提供丰富的对齐方式,满足各种布局需求
避坑指南️:
- ❌ 不要过度使用Flex布局,简单布局使用Column/Row更高效
- ❌ 避免同时设置
flexGrow和固定尺寸,可能导致布局混乱 - ❌ 不要在需要精确对齐的场景过度依赖Flex布局
- ✅ 推荐:复杂多列布局使用
FlexWrap.Wrap实现自适应排列 - ✅ 推荐:使用
flexGrow实现比例分配(如1:2:1)
第二章:状态管理API
2.1 状态装饰器API
@State - 组件内部状态
功能概述:
@State是最基础的状态装饰器,用于管理组件内部状态,当状态变化时,会自动触发组件重新渲染。
核心接口:
@Component
struct CounterComponent {
// 声明状态变量
@State count: number = 0
build() {
Column() {
Text(`Count: ${this.count}`)
Button('+')
.onClick(() => {
// 修改状态变量,自动触发UI更新
this.count++
})
}
}
}
实战解析:
- 状态声明:使用
@State装饰器声明状态变量并初始化 - 状态修改:直接修改状态变量值即可触发UI更新
- 适用场景:组件内部使用的状态,不需要与其他组件共享
- 支持类型:支持number、string、boolean、object、array等多种类型
避坑指南️:
- ❌ 不要在状态变量初始化时执行复杂计算或网络请求
- ❌ 避免声明过多@State变量,可能导致状态管理混乱
- ❌ 修改对象类型状态时直接修改属性(不会触发UI更新)
- ✅ 正确修改对象状态:
this.user = { ...this.user, name: 'newName' } - ✅ 推荐:状态变量名使用有意义的名称,如
isSelected而非flag
@Prop - 父子组件单向绑定
功能概述:
@Prop用于实现父子组件间的单向数据传递,父组件状态变化时,子组件会自动更新,但子组件不能修改父组件传递的状态。
核心接口:
// 子组件
@Component
struct ChildComponent {
// 声明Prop变量,接收父组件传递的值
@Prop message: string
build() {
Text(this.message)
}
}
// 父组件
@Entry
@Component
struct ParentComponent {
@State parentMessage: string = "Hello"
build() {
Column() {
// 传递状态给子组件
ChildComponent({ message: this.parentMessage })
Button('Change')
.onClick(() => {
// 修改父组件状态,子组件自动更新
this.parentMessage = "HarmonyOS"
})
}
}
}
实战解析:
- 数据流向:父组件→子组件的单向数据流
- 初始化:子组件@Prop变量必须由父组件传递初始化值
- 类型约束:子组件@Prop变量类型必须与父组件传递的值类型一致
- 适用场景:父组件控制子组件状态,子组件无需反馈给父组件
避坑指南️:
- ❌ 不要在子组件中直接修改@Prop变量(不会生效且控制台会报错)
- ❌ 避免传递复杂对象作为@Prop,可能影响性能
- ❌ 不要在@Prop变量上使用默认值同时又要求父组件必须传递
- ✅ 推荐:子组件通过回调函数通知父组件状态变化
- ✅ 推荐:复杂数据传递考虑使用@Link或状态管理模式
@Link - 父子组件双向绑定
功能概述:
@Link实现父子组件间的双向数据绑定,子组件修改@Link变量时,父组件对应的状态也会同步更新。
核心接口:
// 子组件
@Component
struct ChildComponent {
// 声明Link变量
@Link count: number
build() {
Button(`Count: ${this.count}`)
.onClick(() => {
// 修改Link变量,父组件状态也会更新
this.count++
})
}
}
// 父组件
@Entry
@Component
struct ParentComponent {
@State count: number = 0
build() {
Column() {
// 使用$符号传递状态引用
ChildComponent({ count: $count })
Text(`Parent Count: ${this.count}`)
}
}
}
实战解析:
- 双向绑定:子组件修改@Link变量,父组件状态同步更新
- 传递方式:父组件通过
$变量名传递状态引用 - 适用场景:需要在子组件中修改父组件状态的场景
- 类型匹配:子组件@Link变量类型必须与父组件状态类型一致
避坑指南️:
- ❌ 避免在多层级组件中使用@Link,可能导致数据流混乱
- ❌ 不要在循环中使用@Link,可能导致性能问题
- ❌ 避免过度使用@Link,简单场景优先使用@Prop+回调
- ✅ 推荐:明确需要双向修改时才使用@Link
- ✅ 推荐:复杂状态考虑使用@Provide/@Consume或状态管理库
2.2 事件处理API
点击事件 - onClick
功能概述:
onClick是最常用的事件处理API,用于响应组件的点击操作,实现用户交互逻辑。
核心接口:
// 基础用法
Button('Click Me')
.onClick((event: ClickEvent) => {
// 处理点击事件
console.log('Button clicked');
console.log(`点击位置: (${event.localX}, ${event.localY})`);
})
// 其他支持点击事件的组件
Text('可点击文本')
.onClick(() => {
console.log('Text clicked');
})
Image($r('app.media.icon'))
.onClick(() => {
console.log('Image clicked');
})
实战解析:
- 事件对象:提供点击位置、时间戳等信息
- 适用组件:Button、Text、Image等大多数组件都支持onClick
- 事件冒泡:事件会从子组件向父组件冒泡
- 防抖处理:对于高频点击场景需要添加防抖处理
避坑指南️:
- ❌ 不要在onClick中执行复杂计算或网络请求,会导致界面卡顿
- ❌ 避免在短时间内触发多次点击(如双击场景)
- ❌ 不要在事件处理中直接修改DOM或组件属性
- ✅ 推荐:复杂逻辑使用独立函数封装,保持事件处理简洁
- ✅ 推荐:高频点击场景添加防抖:
Button('Click').onClick(debounce(handleClick, 300))
手势识别 - Gesture
功能概述:
Gesture API提供更丰富的用户交互识别能力,支持点击、滑动、缩放、旋转等多种手势。
核心接口:
// 点击手势
Text('双击我')
.gesture(
TapGesture({ count: 2 }) // 双击手势
.onAction(() => {
console.log('Double tapped');
})
)
// 滑动手势
Image($r('app.media.image'))
.gesture(
PanGesture()
.onActionStart((event) => {
console.log('滑动开始');
})
.onActionUpdate((event) => {
console.log(`滑动距离: ${event.offsetX}, ${event.offsetY}`);
})
.onActionEnd(() => {
console.log('滑动结束');
})
)
// 组合手势
Text('组合手势')
.gesture(
GestureGroup(GestureMode.Sequential) // 顺序识别
.add(TapGesture().onAction(() => console.log('Tap')))
.add(PanGesture().onActionUpdate(() => console.log('Pan')))
)
实战解析:
- 手势类型:支持TapGesture(点击)、PanGesture(滑动)、PinchGesture(缩放)等
- 手势状态:提供开始、更新、结束等状态回调
- 手势组合:通过GestureGroup实现多手势组合识别
- 手势配置:可配置点击次数、滑动方向等识别条件
避坑指南️:
- ❌ 避免在同一组件上添加过多手势,可能导致识别冲突
- ❌ 不要在手势事件中频繁修改UI状态,会影响性能
- ❌ 避免复杂手势组合,可能导致识别不准确
- ✅ 推荐:设置合理的手势识别条件,如最小滑动距离
- ✅ 推荐:手势操作提供明确的视觉反馈
第三章:数据存储与网络API
3.1 本地存储API
Preferences - 轻量级键值对存储
功能概述:
Preferences是鸿蒙提供的轻量级键值对存储API,适用于保存应用配置、用户偏好等简单数据。
核心接口:
import preferences from '@ohos.data.preferences';
// 初始化Preferences
async initPreferences(context: Context) {
try {
// 获取Preferences实例
const pref = await preferences.getPreferences(context, 'app_prefs');
// 保存数据
await pref.put('username', '张三');
await pref.put('isFirstLaunch', false);
await pref.flush(); // 持久化到磁盘
// 获取数据
const username = await pref.get('username', '默认值');
const isFirstLaunch = await pref.get('isFirstLaunch', true);
// 删除数据
await pref.delete('tempData');
await pref.flush();
} catch (error) {
console.error('Preferences操作失败', error);
}
}
实战解析:
- 初始化:通过
getPreferences获取实例,需要上下文和存储名称 - 数据操作:支持put(保存)、get(获取)、delete(删除)等操作
- 持久化:修改数据后需调用flush()持久化到磁盘
- 支持类型:string、number、boolean、Array、Object等基本类型
避坑指南️:
- ❌ 不要使用Preferences存储大量数据或复杂对象(建议不超过1MB)
- ❌ 忘记调用flush(),可能导致数据未持久化丢失
- ❌ 在UI线程执行大量Preferences操作,可能导致界面卡顿
- ✅ 推荐:将Preferences操作封装为服务类,集中管理
- ✅ 推荐:敏感数据加密后再存储,避免明文保存
关系型数据库 - RelationalStore
功能概述:
RelationalStore提供结构化数据存储能力,支持SQL查询,适用于需要复杂查询的结构化数据存储场景。
核心接口:
import relationalStore from '@ohos.data.relationalStore';
// 初始化数据库
async initDatabase(context: Context) {
try {
// 配置数据库
const config = {
name: 'my_database.db', // 数据库名称
securityLevel: relationalStore.SecurityLevel.S1 // 安全级别
};
// 获取数据库实例
const db = await relationalStore.getRdbStore(context, config);
// 创建表
await db.executeSql(`
CREATE TABLE IF NOT EXISTS user (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
email TEXT UNIQUE
)
`);
// 插入数据
const values = { name: '张三', age: 25, email: 'zhangsan@example.com' };
const rowId = await db.insert('user', values);
// 查询数据
const resultSet = await db.querySql('SELECT * FROM user WHERE age > ?', [20]);
} catch (error) {
console.error('数据库操作失败', error);
}
}
实战解析:
- 数据库配置:指定名称、安全级别等参数
- 表结构设计:通过SQL语句创建表结构
- CRUD操作:支持插入、查询、更新、删除等操作
- 事务支持:复杂操作可使用事务保证数据一致性
避坑指南️:
- ❌ 不要在UI线程执行复杂查询,会导致界面卡顿
- ❌ 避免创建过多表或复杂表结构,影响性能
- ❌ 忘记关闭ResultSet,可能导致资源泄漏
- ✅ 推荐:使用参数化查询避免SQL注入风险
- ✅ 推荐:大量数据查询使用分页查询减轻内存压力
3.2 网络请求API
HTTP请求 - @ohos.net.http
功能概述:
HTTP API用于发起网络请求,获取网络数据,是实现应用与服务器交互的核心API。
核心接口:
import http from '@ohos.net.http';
// 发起GET请求
async requestData() {
// 创建HTTP请求
let request = http.createHttp();
try {
// 发起请求
let response = await request.request(
'https://api.example.com/data',
{
method: http.RequestMethod.GET, // 请求方法
header: {
'Content-Type': 'application/json' // 请求头
},
connectTimeout: 60000, // 连接超时时间
readTimeout: 60000 // 读取超时时间
}
);
// 处理响应
if (response.responseCode === 200) {
// 解析JSON数据
const result = JSON.parse(response.result as string);
console.log('请求成功', result);
return result;
} else {
console.error(`请求失败,状态码: ${response.responseCode}`);
return null;
}
} catch (error) {
console.error('网络请求异常', error);
return null;
} finally {
// 销毁HTTP请求,释放资源
request.destroy();
}
}
实战解析:
- 请求方法:支持GET、POST、PUT、DELETE等常用HTTP方法
- 请求头设置:通过header设置Content-Type、Authorization等信息
- 超时设置:合理设置超时时间,避免长时间无响应
- 响应处理:根据responseCode判断请求状态,200表示成功
避坑指南️:
- ❌ 不要在主线程执行网络请求,会导致界面卡顿
- ❌ 忘记设置网络权限,导致请求失败
- ❌ 未处理网络异常和错误状态码
- ❌ 没有销毁request对象,可能导致资源泄漏
- ✅ 推荐:封装网络请求工具类,统一处理请求和响应
- ✅ 推荐:添加请求缓存机制,减少重复请求
第四章:分布式能力API
4.1 设备管理API
DeviceManager - 分布式设备管理
功能概述:
DeviceManager API用于发现和管理分布式网络中的设备,是实现跨设备协同的基础。
核心接口:
import deviceManager from '@ohos.distributedDeviceManager';
// 初始化设备管理器
initDeviceManager(context: Context) {
// 创建设备管理器实例
const dmInstance = deviceManager.createDistributedDeviceManager(context);
if (!dmInstance) {
console.error('创建DeviceManager失败');
return;
}
// 获取可信设备列表
try {
const devices = dmInstance.getTrustedDeviceListSync();
console.log(`发现${devices.length}个可信设备`);
devices.forEach(device => {
console.log(`设备名称: ${device.deviceName}, 设备ID: ${device.deviceId}`);
});
} catch (error) {
console.error('获取设备列表失败', error);
}
// 发现周边设备
dmInstance.startDeviceDiscovery();
// 监听设备发现事件
dmInstance.on('deviceFound', (device) => {
console.log(`发现新设备: ${device.deviceName}`);
});
// 监听设备状态变化
dmInstance.on('deviceStateChange', (device) => {
console.log(`设备状态变化: ${device.deviceName}, 状态: ${device.status}`);
});
}
实战解析:
- 设备管理器创建:通过createDistributedDeviceManager创建实例
- 设备发现:调用startDeviceDiscovery开始发现周边设备
- 设备列表:通过getTrustedDeviceListSync获取可信设备
- 事件监听:监听deviceFound、deviceStateChange等事件获取设备变化
避坑指南️:
- ❌ 不要频繁调用startDeviceDiscovery和stopDeviceDiscovery
- ❌ 未申请分布式权限,导致设备发现失败
- ❌ 忘记注销事件监听器,可能导致内存泄漏
- ✅ 推荐:使用完设备管理器后及时释放资源
- ✅ 推荐:设备操作提供明确的用户授权和提示
4.2 分布式数据同步API
DistributedData - 分布式数据同步
功能概述:
DistributedData API用于实现跨设备数据同步,支持多设备间的数据共享和协同。
核心接口:
import distributedData from '@ohos.data.distributedData';
// 初始化分布式数据存储
async initDistributedData(context: Context) {
try {
// 创建KVManager
const kvManager = distributedData.createKVManager({
context: context,
bundleName: 'com.example.myapp'
});
// 创建KVStore
const kvStore = await kvManager.getKVStore('my_store', {
createIfMissing: true,
encrypt: false,
backup: false,
autoSync: true // 开启自动同步
});
// 监听数据变化
kvStore.on('dataChange', distributedData.SubscribeType.SUBSCRIBE_TYPE_ALL, (data) => {
console.log(`数据变化: key=${data.key}, value=${data.value}`);
});
// 写入数据
await kvStore.put('username', '张三');
// 同步数据到指定设备
const devices = dmInstance.getTrustedDeviceListSync();
if (devices.length > 0) {
await kvStore.sync(devices[0].deviceId, distributedData.SyncMode.PUSH_PULL);
}
} catch (error) {
console.error('分布式数据操作失败', error);
}
}
实战解析:
- KVManager创建:需要上下文和应用bundleName
- KVStore操作:支持数据的增删改查和同步
- 数据同步:通过sync方法将数据同步到其他设备
- 数据监听:监听dataChange事件获取数据变化
避坑指南️:
- ❌ 不要同步大量数据或敏感数据,可能导致性能和安全问题
- ❌ 未处理数据同步冲突,可能导致数据不一致
- ❌ 没有申请分布式权限,导致同步失败
- ✅ 推荐:重要数据同步前进行加密
- ✅ 推荐:设置合理的数据同步策略和冲突解决机制
第五章:API避坑指南与最佳实践
5.1 常见API错误与解决方案
UI渲染相关错误
表格
复制
| 常见错误 | 错误原因 | 解决方案 |
|---|---|---|
| 组件不显示 | 尺寸设置不当或父容器隐藏 | 检查width/height设置,确保组件可见 |
| 布局错乱 | 嵌套层级过多或对齐方式错误 | 简化布局层级,使用正确的对齐方式 |
| 列表滑动卡顿 | 列表项复杂或未使用懒加载 | 使用LazyForEach,简化列表项布局 |
| 图片加载失败 | 路径错误或权限问题 | 检查图片路径,申请文件访问权限 |
| 文本溢出 | 未设置maxLines或宽度不足 | 设置maxLines和textOverflow,确保足够宽度 |
状态管理相关错误
表格
复制
| 常见错误 | 错误原因 | 解决方案 |
|---|---|---|
| 状态更新UI不刷新 | 直接修改对象属性或数组元素 | 创建新对象或数组触发UI更新 |
| 子组件不更新 | 未使用状态装饰器或单向绑定 | 使用@Prop/@Link等状态装饰器 |
| 状态混乱 | 状态定义位置不合理 | 遵循状态提升原则,状态定义在使用它的最高层级 |
| 性能问题 | 频繁更新状态或状态过多 | 合并状态更新,减少不必要的状态 |
数据存储相关错误
表格
复制
| 常见错误 | 错误原因 | 解决方案 |
|---|---|---|
| 数据未持久化 | 忘记调用flush() | 数据修改后调用flush()持久化 |
| 存储容量超限 | 存储大量数据或大文件 | 改用数据库或文件存储,清理无用数据 |
| 数据读取失败 | 键名错误或数据类型不匹配 | 检查键名和数据类型,使用默认值避免崩溃 |
| 数据库操作异常 | SQL语句错误或表结构问题 | 检查SQL语法,确保表结构正确 |
5.2 API使用最佳实践
UI开发最佳实践
- 组件化开发:将复杂界面拆分为多个自定义组件,提高复用性和维护性
- 样式统一管理:使用公共样式常量和主题,确保界面风格一致
- 响应式布局:使用相对单位和弹性布局,适配不同设备尺寸
- 图片优化: 根据设备分辨率加载合适尺寸图片,使用缓存减少加载时间
- 列表优化: 长列表使用LazyForEach,减少内存占用和渲染压力
状态管理最佳实践
- 状态最小化:只将需要响应式更新的数据声明为状态变量
- 单向数据流:尽量保持数据单向流动,便于追踪和调试
- 状态分层:局部状态、页面状态、应用状态分层管理
- 复杂状态管理:复杂应用考虑使用状态管理库或设计模式
- 避免过度渲染:合理设计状态粒度,避免不必要的UI更新
性能优化最佳实践
- 减少重绘:避免频繁修改会导致重绘的属性
- 资源释放:及时销毁定时器、监听器等资源
- 异步处理:耗时操作使用异步处理,避免阻塞UI线程
- 缓存策略:合理使用缓存减少网络请求和计算
- 按需加载:非关键资源和组件延迟加载,加快启动速度
结语:高效使用API的艺术
API是鸿蒙开发的基石,高效使用API不仅能提高开发效率,还能避免常见错误和性能问题。本指南介绍了鸿蒙开发中最常用的高频API和避坑指南,希望能帮助开发者更好地理解和使用这些API。
学习资源:码牛教育官方的动态 - 哔哩哔哩
API的使用是一门不断精进的艺术,希望本指南能成为你鸿蒙开发之路上的实用工具,帮助你更高效地开发出优秀的鸿蒙应用。