你正在为HarmonyOS应用开发相关功能。以下是你需要遵循的开发规则。
StateStore进行全局管理,将数据集中存储,实现状态与UI的解耦。StateStore管理且能触发UI更新的业务数据,必须使用@Observed或@ObservedV2装饰器修饰。@State, @Prop, @Link等装饰器的工作原理,明确它们如何触发UI刷新。@Link: Link实现双向绑定。若仅需单向传递数据,优先考虑@Prop或普通参数,以减少不必要的子组件刷新范围。onClick)、生命周期回调(如onAppear)、数据请求回调等明确的事件中。build方法副作用: 绝对避免在组件的build方法或其直接调用的计算属性/函数中修改非状态变量或执行其他副作用操作。build方法中使用的@State变量)。@Link: 避免在仅需单向数据流的场景下使用@Link,这会增加不必要的双向依赖和刷新风险。@Component
struct MyCounter {
@State count: number = 0; // 状态变量,UI依赖
build() {
Column() {
Text(`当前计数: ${this.count}`)
.fontSize(24)
Button('增加')
.onClick(() => {
this.count++; // 状态在事件回调中修改,触发UI刷新
})
}
}
}
// 避免写法1: 在build方法直接调用的函数中引入副作用
@Component
struct BadImageEffect {
private currentOpacity: number = 0; // 非状态变量
// 该函数在每次build时都会被调用,意外修改非状态变量
private calculateOpacity(): number {
this.currentOpacity = (this.currentOpacity + 0.1) % 1;
return this.currentOpacity;
}
build() {
Image('icon.png')
.opacity(this.calculateOpacity()) // 每次UI刷新都累加opacity
}
}
// 避免写法2: 冗余状态变量
@Entry
@Component
struct BadComponent {
// 变量未关联任何UI组件,或仅被读取但未修改,不应定义为状态变量
@State unusedData: string = 'some data';
@State readonlyMessage: string = 'Hello';
build() {
Column() {
// 仅读取readonlyMessage,未修改
Text(this.readonlyMessage)
}
}
}
hidumper)来分析应用运行时状态变量的变化和UI组件的刷新情况,定位冗余刷新问题。Code Linter工具进行代码检查,重点关注性能优化规则(如@performance/hp-arkui-remove-redundant-state-var),并根据扫描结果进行优化。