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
只在使用状态变量的组件会重新渲染,可以参考下面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的疑惑,可能主要集中在以下几个方面:
-
数据同步机制:ObjectLink利用底层通信机制,确保数据变化能实时同步到所有绑定的消费者。这种机制减少了数据不一致的问题,但开发者需明确数据的读写权限,避免数据冲突。
-
生命周期管理:ObjectLink对象的生命周期与绑定它的组件或页面相关。当组件销毁时,ObjectLink会自动断开连接,释放资源。开发者需注意在组件生命周期内合理使用ObjectLink,避免资源泄露。
-
性能影响:虽然ObjectLink提供了高效的数据同步机制,但在大量数据频繁更新时,仍可能对性能产生影响。开发者需根据应用场景,评估数据同步的频率和规模,优化数据结构,减少不必要的同步开销。
-
异常处理:在使用ObjectLink时,可能会遇到数据访问异常、同步失败等问题。开发者需做好异常处理,确保应用的稳定性和用户体验。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html