HarmonyOS 鸿蒙Next @Link @Watch绑定一个类,可以控制类中的几个特殊字段更新时可以不更新UI吗

发布于 1周前 作者 caililin 来自 鸿蒙OS

HarmonyOS 鸿蒙Next @Link @Watch绑定一个类,可以控制类中的几个特殊字段更新时可以不更新UI吗

@Link @Watch(‘onBackDropChange’) backDrop: BackDrop 
组件里观察了backDrop,内部字段一有改变会调用onBackDropChange方法 
但我希望backDrop里有某几个特殊字段改变时不调用onBackDropChange,除了这几个字段别的字段更新照常调用onBackDropChange,有办法实现吗


更多关于HarmonyOS 鸿蒙Next @Link @Watch绑定一个类,可以控制类中的几个特殊字段更新时可以不更新UI吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

你是有一个自定义组件,其中有个状态变量status。这个自定义组件可能在多个场景下用到,传递的参数可能就是个状态变量,这样你就可以使用@Link实现父子组件的双向同步。但是在某些场景下你使用这个自定义组件的入参可能是一个状态变量的一个字段,这个时候初始化自定义组件就会有问题。这边给你提供了一种方案,不知是否可行。由于你传递给自定义组件的可能是状态变量,也有可能是常规变量,当前如果不是系统组件$$是无法实现的,所以是否可以使用一个桥接组件,类似于下方代码,场景一使用YourCustomComponent组件,场景二使用BridgeComponent组件,均可双向同步。

class ClassA {
 [@Track](/user/Track) public field: string;

 constructor(field: string) {
   this.field = field;
 }
}

[@Component](/user/Component)
[@Entry](/user/Entry)
struct Index {
 [@State](/user/State) a: ClassA = new ClassA("a123");
 [@State](/user/State) b:string = "b123"


 build() {
   Row() {
     Column() {
       Text("parent" + this.a.field);
       BridgeComponent({ a: this.a });

       YourCustomComponent({status: this.b});

       Button("changeA").onClick(() => {
         this.a.field = "234"
       })
     }
     .width('100%')
   }
   .height('100%')
 }
}


[@Component](/user/Component)
struct BridgeComponent {
 [@Link](/user/Link) [@Watch](/user/Watch)("onClassAChange") a: ClassA;
 [@Watch](/user/Watch)("onStatusChange") [@State](/user/State) status: string = '';

 aboutToAppear(): void {
   this.status = this.a.field;
 }

 build() {
   Column() {
     YourCustomComponent({ status: this.status })
   }
 }
 onClassAChange() {
   this.status = this.a.field;
 }

 onStatusChange() {
   this.a.field = this.status;
 }
}

[@Component](/user/Component)
struct YourCustomComponent {
 [@Link](/user/Link) status: string;

 build() {
   Column() {
     Text(this.status)

     Button("CustomComponent1 change").onClick(() => {
       this.status = "3456"
     })
   }
 }
}

更多关于HarmonyOS 鸿蒙Next @Link @Watch绑定一个类,可以控制类中的几个特殊字段更新时可以不更新UI吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,通过@Link@Watch绑定一个类时,若希望控制类中某些特殊字段更新时不触发UI更新,可以通过以下几种方式实现:

  1. 数据标记:在字段上使用自定义注解或标记,表明这些字段的变更不需要触发UI更新。系统框架或自定义的绑定逻辑可以识别这些标记,从而忽略这些字段的变更通知。

  2. 细粒度控制:在数据变更通知逻辑中,增加条件判断,仅当特定字段变更时,才决定是否触发UI更新。这需要手动管理数据变更通知的逻辑,确保只有必要的字段变更才会影响UI。

  3. 局部更新:对于需要更新的UI部分,使用局部刷新机制,而非整体重绘。这样,即使数据层发生变化,也只有受影响的UI组件会进行更新。

  4. 事件驱动:将UI更新与数据变更解耦,通过事件系统来触发UI更新。在数据变更时,根据字段的不同,决定是否发布特定的事件,UI层监听这些事件来进行更新。

请注意,实现上述功能需要对HarmonyOS的数据绑定机制和UI更新机制有深入理解。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部