下面代码创建了自定义组件ComponentA、SpecialImage,每个组件都拥有一些状态变量和UI组件。组件ComponentA中存在Move和Scale两个按钮,在按钮的点击回调中改变状态变量的值刷新相应的组件。
// 常量声明
const animationDuration: number = 500; // move动画时长
const opacityChangeValue: number = 0.1; // opacity每次变化的值
const opacityChangeRange: number = 1; // opacity变化的范围
const translateYChangeValue: number = 180; // translateY每次变化的值
const translateYChangeRange: number = 250; // translateY变化的范围
const scaleXChangeValue: number = 0.6; // scaleX每次变化的值
const scaleXChangeRange: number = 0.8; // scaleX每次变化的值
// 样式属性类
class UIStyle {
public translateX: number = 0;
public translateY: number = 0;
public scaleX: number = 0.3;
public scaleY: number = 0.3;
}
@Component
struct ComponentA {
@Link uiStyle: UIStyle; // uiStyle的属性被多个组件使用
build() {
Column() {
// 使用状态变量的组件
SpecialImage({ specialImageUiStyle: this.uiStyle })
Stack() {
Column() {
Image($r('app.media.app_icon'))
.height(78)
.width(78)
.scale({
x: this.uiStyle.scaleX,
y: this.uiStyle.scaleY
})
}
Stack() {
Text('Hello World')
}
}
.translate({
x: this.uiStyle.translateX,
y: this.uiStyle.translateY
})
// 通过按钮点击回调修改状态变量的值,引起相应的组件刷新
Column() {
Button('Move')
.onClick(() => {
animateTo({ duration: animationDuration }, () => {
this.uiStyle.translateY = (this.uiStyle.translateY + translateYChangeValue) % translateYChangeRange;
})
})
Button('Scale')
.onClick(() => {
this.uiStyle.scaleX = (this.uiStyle.scaleX + scaleXChangeValue) % scaleXChangeRange;
})
}
}
}
}
@Component
struct SpecialImage {
@Link specialImageUiStyle: UIStyle;
private opacityNum: number = 0.5; // 默认透明度
private isRenderSpecialImage(): number {
// Image每次渲染时透明度增加0.1, 在0-1之间循环
this.opacityNum = (this.opacityNum + opacityChangeValue) % opacityChangeRange;
return this.opacityNum;
}
build() {
Column() {
Image($r('app.media.app_icon'))
.size({ width: 200, height: 200 })
.scale({
x: this.specialImageUiStyle.scaleX,
y: this.specialImageUiStyle.scaleY
})
.opacity(this.isRenderSpecialImage())
Text("SpecialImage")
}
}
}
@Entry
@Component
struct DFXStateBeforeOptimization {
@State uiStyle: UIStyle = new UIStyle();
build() {
Column() {
ComponentA({
uiStyle: this.uiStyle
})
}
.width('100%')
.height('100%')
}
}
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。
可以结合hidumper工具来介绍冗余刷新的问题定位。
使用以下命令获取示例应用的窗口Id。当前运行的示例应用包名为performancelibrary,可以在输出结果中找到对应窗口名performancelibrary0的WinId,即为应用的窗口Id。或者当应用正处于前台运行时,Focus window的值就是应用的窗口Id。此处示例应用的窗口Id为11,后面的流程中使用的命令都需要指定窗口Id。
基于上一步获取的窗口Id 11,使用-viewHierarchy命令携带-r 参数递归打印应用的自定义组件树。
打印应用的自定义组件树结果如下:
从结果中找到目标组件ComponentA,后面括号中的内容即为组件ComponentA的节点Id 70。
使用命令-stateVariables携带参数-viewId(参数的值为ComponentA的节点Id)获取自定义组件ComponentA中的状态变量信息。
打印组件ComponentA的状态变量信息如下:
结果显示ComponentA拥有@Link/@Consume类型的状态变量uiStyle。每条状态变量的详细信息都包含状态变量的所属组件、同步对象和关联组件。
① Sync peers表示uiStyle在自定义组件SpecialImage中存在@Link/@Consume类型的状态变量specialImageUiStyle订阅数据变化。
② Dependent components表示在ComponentA组件中存在组件
Stack[75]
和Image[77]
使用了状态变量uiStyle,关联组件的数量为2。所以当uiStyle变化时,影响的组件范围为自定义组件SpecialImage以及系统组件

Stack[75]
和Image[77]
。本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。