首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >ArkUI 开发常见问题与最佳实践

ArkUI 开发常见问题与最佳实践

作者头像
程序猿的栖息地
发布2026-07-07 15:27:04
发布2026-07-07 15:27:04
50
举报

ArkUI 开发常见问题与最佳实践参考

常见 Bug 与修复

1. 状态更新但 UI 不刷新

原因:@State 只能观测到第一层属性变化,嵌套属性修改不会触发刷新。

代码语言:javascript
复制
// ❌ 错误:直接修改嵌套属性
@State order: Order = new Order()
this.order.items[0].quantity = 2 // UI 不会更新
 
// ✅ 修复方式一:整体赋值(触发@State观测)
this.order = { ...this.order, items: [...this.order.items] }
 
// ✅ 修复方式二(推荐,API 12+):使用 @ObservedV2 + @Trace
@ObservedV2
class Order {
 @Trace items: OrderItem[] = []
}
this.order.items[0].quantity = 2 // UI 正常更新

2. ForEach 渲染异常

原因:keyGenerator 不唯一或不稳定。

代码语言:javascript
复制
// ❌ 错误:使用 index 作为 key
ForEach(this.list, (item) => { ... }, (item, index) => index.toString())
 
// ✅ 正确:使用业务唯一标识
ForEach(this.list, (item) => { ... }, (item) => item.id.toString())

3. 子组件 @Prop 修改不同步父组件

代码语言:javascript
复制
// ❌ 误用 @Prop 期望双向同步
@Component struct Child {
 @Prop count: number = 0 // 单向传递
}
 
// ✅ 需要双向同步时使用 @Link
@Component struct Child {
 @Link count: number // 双向同步
}
// 父组件传递:Child({ count: $count })

4. CustomDialog 关闭后内存泄漏

代码语言:javascript
复制
// ❌ 错误:dialogController 不释放
dialogController: CustomDialogController = new CustomDialogController({ ... })
 
// ✅ 正确:在 aboutToDisappear 中释放
aboutToDisappear() {
 this.dialogController = undefined // 释放控制器
}

5. HTTP 请求不 destroy 导致连接泄漏

代码语言:javascript
复制
// ❌ 错误:请求后不销毁
const httpRequest = http.createHttp()
httpRequest.request(url, options)
 
// ✅ 正确:在 finally 中销毁
try {
 const response = await httpRequest.request(url, options)
 // 处理响应
} finally {
 httpRequest.destroy()
}

6. 页面路由参数丢失

代码语言:javascript
复制
// ❌ 错误:在 aboutToAppear 中使用 router.getParams() 可能返回 null
aboutToAppear() {
 const params = router.getParams() // 可能为null
}
 
// ✅ 正确:添加空值检查
aboutToAppear() {
 const params = router.getParams() as Record<string, Object> | null
 if (params) {
 this.id = params['id'] as string
 }
}

7. @Builder 参数传递问题

代码语言:javascript
复制
// ❌ 错误:@Builder 按引用传递时参数变化不触发UI刷新
@Builder ItemBuilder(item: Item) {
 Text(item.name) // item是按值传递,修改item不会刷新
}
 
// ✅ 正确:使用 @Builder 按引用传递
@Builder ItemBuilder($: { item: Item }) {
 Text($.item.name) // 按引用传递,变化会刷新
}

性能优化最佳实践

1. 懒加载与按需渲染

代码语言:javascript
复制
// 大数据列表使用 LazyForEach 而不是 ForEach
class MyDataSource implements IDataSource {
 // ...实现 IDataSource 接口
}
 
List() {
 LazyForEach(this.dataSource, (item) => {
 ListItem() { this.ItemBuilder(item) }
 }, (item) => item.id.toString())
}
 
// 条件渲染避免渲染不可见的内容
if (this.isVisible) {
 ComplexComponent()
}
// 而不是
ComplexComponent().visibility(this.isVisible ? Visibility.Visible : Visibility.None)

2. 减少状态变量数量

代码语言:javascript
复制
// ❌ 过多独立状态变量
@State name: string = ''
@State age: number = 0
@State gender: string = ''
@State address: string = ''
 
// ✅ 合并为对象(减少观测开销)
@State userInfo: UserInfo = { name: '', age: 0, gender: '', address: '' }

3. 精确控制刷新范围

代码语言:javascript
复制
// ❌ 大范围状态变更触发整页刷新
@State pageData: PageData = { ... }
 
// ✅ 将频繁变化的状态放在独立组件中
@Component
struct PriceDisplay {
 @Prop price: number = 0 // 只刷新价格区域
 build() { Text(`¥${this.price}`) }
}

4. 避免频繁创建新对象

代码语言:javascript
复制
// ❌ 每次渲染创建新对象
ForEach(this.items, (item) => {
 ListItem() {
 Row({ space: 10 }) { ... } // 每次创建新Row
 }
})
 
// ✅ 使用 @Builder 复用UI结构
@Builder ItemBuilder(item: Item) {
 Row({ space: 10 }) { ... }
}

5. 图片优化

代码语言:javascript
复制
// 使用合适的图片解码尺寸
Image(url)
 .objectFit(ImageFit.Cover)
 .interpolation(ImageInterpolation.Low) // 小图不需要高插值
 
// 缓存图片
.autoResize(true)
.syncLoad(false) // 异步加载避免阻塞

ArkTS 编码规范

类和对象必须先声明再使用

,ArkTS 不支持声明提升

使用 as 类型断言需谨慎

,ArkTS 对类型检查更严格

不要使用 any 类型

,使用具体类型或泛型

枚举仅支持数字枚举

空安全

:明确区分 null / undefined / 初始值

$ 双绑语法仅用于特定场景

:TextInput、Toggle、Slider 等

@Builder 函数的参数传递方式

按值传递:@Builder func(param: Type) — 不追踪变化

按引用传递:@Builder func($: { param: Type }) — 追踪变化

代码审查要点清单

代码语言:javascript
复制
每次请求后是否在 finally 中调用 destroy()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿的栖息地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ArkUI 开发常见问题与最佳实践参考
  • 常见 Bug 与修复
  • 1. 状态更新但 UI 不刷新
  • 2. ForEach 渲染异常
  • 3. 子组件 @Prop 修改不同步父组件
  • 4. CustomDialog 关闭后内存泄漏
  • 5. HTTP 请求不 destroy 导致连接泄漏
  • 6. 页面路由参数丢失
  • 7. @Builder 参数传递问题
  • 性能优化最佳实践
  • 1. 懒加载与按需渲染
  • 2. 减少状态变量数量
  • 3. 精确控制刷新范围
  • 4. 避免频繁创建新对象
  • 5. 图片优化
  • ArkTS 编码规范
  • 代码审查要点清单
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档