HarmonyOS 鸿蒙Next 状态管理之ObjectLink的疑惑

HarmonyOS 鸿蒙Next 状态管理之ObjectLink的疑惑

以下代码中,@ObjectLink修饰了 price 对象,而在第二个 Text 组件中,我们并不直接将 price.mPriceNormal 赋值给 Text,而是通过 getPriceText() 进行间接引用
问题:当外部改变 price 对象中的 mPriceNormal 属性时,底层框架是否会准确检测到第二个 Text 需要重绘?第一个 Text 会不会也被重绘

@Component
struct PriceWidget {
[@ObjectLink](/user/ObjectLink) price: Price

build() {
Stack({ alignContent: Alignment.End }) {
Row() {
Text("price")
Text(this.getPriceText()).fontSize(15).fontColor(this.getPriceColor())
}
}.width(75)
}

getPriceText(): string {
let price = this.price
if (price == null) {
return ""
} else if (price.mPriceNormal == null || isNaN(price.mPriceNormal) || !isFinite(price.mPriceNormal)) {
return ""
} else {
return price.mPriceNormal.toFixed(this.accuracy);
}
}
}

更多关于HarmonyOS 鸿蒙Next 状态管理之ObjectLink的疑惑的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

只在使用状态变量的组件会重新渲染,可以参考下面demo

class BasicDataSource implements IDataSource {
 private listeners: DataChangeListener[] = [];
 private originDataArray: StringData[] = [];
 public totalCount(): number {
   return 0;
 }

 public getData(index: number): StringData {
   return this.originDataArray[index];
 }

 registerDataChangeListener(listener: DataChangeListener): void {
   if (this.listeners.indexOf(listener) < 0) {
     console.info('add listener');
     this.listeners.push(listener);
   }
 }

 unregisterDataChangeListener(listener: DataChangeListener): void {
   const pos = this.listeners.indexOf(listener);
   if (pos >= 0) {
     console.info('remove listener');
     this.listeners.splice(pos, 1);
   }
 }

 notifyDataReload(): void {
   this.listeners.forEach(listener => {
     listener.onDataReloaded();
   })
 }

 notifyDataAdd(index: number): void {
   this.listeners.forEach(listener => {
     listener.onDataAdd(index);
   })
 }

 notifyDataChange(index: number): void {
   this.listeners.forEach(listener => {
     listener.onDataChange(index);
   })
 }

 notifyDataDelete(index: number): void {
   this.listeners.forEach(listener => {
     listener.onDataDelete(index);
   })
 }

 notifyDataMove(from: number, to: number): void {
   this.listeners.forEach(listener => {
     listener.onDataMove(from, to);
   })
 }
}

class MyDataSource extends BasicDataSource {
 private dataArray: StringData[] = [];
 public totalCount(): number {
   return this.dataArray.length;
 }

 public getData(index: number): StringData {
   return this.dataArray[index];
 }

 public addData(index: number, data: StringData): void {
   this.dataArray.splice(index, 0, data);
   this.notifyDataAdd(index);
 }

 public pushData(data: StringData): void {
   this.dataArray.push(data);
   this.notifyDataAdd(this.dataArray.length - 1);
 }
}

[@Observed](/user/Observed)
class StringData {
 message: string;
 constructor(message: string) {
   this.message = message;
 }
}

[@Entry](/user/Entry)
[@Component](/user/Component)
struct MyComponent {
 private moved: number[] = [];
 [@State](/user/State) data: MyDataSource = new MyDataSource();
 
 aboutToAppear() {
   for (let i = 0; i <= 20; i++) {
     this.data.pushData(new StringData(`Hello ${i}`));
   }
 }

 build() {
   List({ space: 3 }) {
     LazyForEach(this.data, (item: StringData, index: number) => {
       ListItem() {
         Row() {
           ChildComponent({ data: item })
           Text(item.message)
         }
       }
       .onClick(() => {
         item.message += '0';
       })
     }, (item: StringData, index: number) => index.toString())
   }.cachedCount(5)
 }
}

[@Component](/user/Component)
struct ChildComponent {
 [@ObjectLink](/user/ObjectLink) [@Watch](/user/Watch)('change') data: StringData

 change() {
   this.dd = this.data.message
   this.ccc = this.data.message
 }

 [@State](/user/State) dd: string = 'sssss'
 private ccc: string = 'sssss'

 build() {
   Row() {
     Text(this.dd)
     Text(this.ccc)
     Text(this.data.message).fontSize(50)
       .onAppear(() => {
         console.info("appear:" + this.data.message)
       })
   }.margin({ left: 10, right: 10 })
 }
}

更多关于HarmonyOS 鸿蒙Next 状态管理之ObjectLink的疑惑的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS 鸿蒙Next 状态管理之ObjectLink主要用于在不同组件或页面间高效传递和共享数据。ObjectLink通过引用机制,允许数据在多个消费者之间保持同步更新,无需手动复制或推送数据变化。

关于ObjectLink的疑惑,可能主要集中在以下几个方面:

  1. 数据同步机制:ObjectLink利用底层通信机制,确保数据变化能实时同步到所有绑定的消费者。这种机制减少了数据不一致的问题,但开发者需明确数据的读写权限,避免数据冲突。

  2. 生命周期管理:ObjectLink对象的生命周期与绑定它的组件或页面相关。当组件销毁时,ObjectLink会自动断开连接,释放资源。开发者需注意在组件生命周期内合理使用ObjectLink,避免资源泄露。

  3. 性能影响:虽然ObjectLink提供了高效的数据同步机制,但在大量数据频繁更新时,仍可能对性能产生影响。开发者需根据应用场景,评估数据同步的频率和规模,优化数据结构,减少不必要的同步开销。

  4. 异常处理:在使用ObjectLink时,可能会遇到数据访问异常、同步失败等问题。开发者需做好异常处理,确保应用的稳定性和用户体验。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部