HarmonyOS 鸿蒙Next @ObservedV2+@Trace状态管理不刷新的问题

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

HarmonyOS 鸿蒙Next @ObservedV2+@Trace状态管理不刷新的问题

咨询描述: List中的某个Listitem代码如下,使用过程中不光需要监听数据,还需要监听数组长度的变化传递给指示器使用XFDotIndicator,指示器里监听count,@Link @Watch(‘onCountChange’) count: number,但是现在count的值一直都是0,没有变化

[@ObservedV2](/user/ObservedV2)
export class ObservedArrayWrapper<T> {
[@Trace](/user/Trace) observedArray: T[] = [];
[@Trace](/user/Trace) count: number = this.observedArray.length;

public clear(): void {
this.observedArray.splice(0, this.observedArray?.length)
}
}

@Reusable
@Component
export struct LogosItem {
logoList?: ObservedArrayWrapper<LogoData[]>;
@State model: XFDotModel = new XFDotModel()
@State index: number = 0
@State count: number | undefined = 0;

aboutToAppear(): void {
this.model.setHeight(10)
this.count = this.logoList?.count;
}

aboutToReuse(params: Record<string, Object>): void {
this.logoList = params.logoList as ObservedArrayWrapper<LogoData[]>
}

build() {

Column() {
Swiper() {
ForEach(this.logoList?.observedArray, (items: LogoData[]) => {
Grid() {
ForEach(items, (logo: LogoData) => {
GridItem() {
Column() {
ImageComponent({
imageOption: {
loadSrc: logo.iconLight,
}
})
.width('32vp')
.height('32vp')
.margin({ top: 8 })

Text(logo.name)
.fontSize('12fp')
.width('100%')
.fontSize('13fp')
.fontColor($r('app.color.text_level1'))
.textAlign(TextAlign.Center)
.margin({ top: 4 })
}
}
.width((px2vp(display.getDefaultDisplaySync().width)) / 5)
})
}
.maxCount(5)
.minCount(5)
.rowsGap(10)
.layoutDirection(GridDirection.Row)
.width('100%')
})
}
.width('100%')
.displayCount(1)
.indicator(false)
.loop(false)
.onChange((index: number) => {
this.index = index;
})

XFDotIndicator({ itemIndex: $index, count: $count, model: this.model })
.margin({ top: 4 })

}.width('100%')
.padding({ top: 4, bottom: 12 })
}
}

更多关于HarmonyOS 鸿蒙Next @ObservedV2+@Trace状态管理不刷新的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

这样的代码可以,你参考看看:

@ObservedV2
class ObData {
  @Trace count: number = 0
}

@Entry
@Component
struct JSONTest {
  obData: ObData = new ObData()
  build() {
    Column({ space: 20 }) {
      CompAAA({
        count: this.obData.count
      })
      Text(${this.obData.count}).onClick(() => {
        this.obData.count++
      })
        .width("100%")
        .backgroundColor(Color.Red)
    }
    .width(200)
    .height(500)
  }
}
@Component
export struct CompAAA {
  @Prop @Watch('onCountChange') count: number
  onCountChange() {
    console.log("")
  }
  build() {
    Text(${this.count}).width("100%").backgroundColor(Color.Green)
  }
}

更多关于HarmonyOS 鸿蒙Next @ObservedV2+@Trace状态管理不刷新的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对“HarmonyOS 鸿蒙Next @ObservedV2+@Trace状态管理不刷新的问题”,以下是专业回答:

在HarmonyOS中,使用@ObservedV2@Trace注解进行状态管理时,如果遇到状态不刷新的问题,可能是由于以下几个原因:

  1. 数据绑定问题:确保你的数据模型(即被@ObservedV2注解的类)中的属性被正确绑定到UI组件上。如果属性发生变化,但UI没有更新,可能是因为绑定关系丢失或未正确建立。

  2. 状态更新未触发:检查你的状态更新逻辑,确保在状态改变时,有调用触发UI更新的方法。例如,在属性setter方法中添加通知UI更新的代码。

  3. 异步更新问题:如果你的状态更新是在异步操作中完成的(如网络请求后的回调),确保在异步操作完成后,正确通知UI进行更新。

  4. @Trace注解使用不当:@Trace注解主要用于性能跟踪,而非直接控制状态刷新。请检查其使用是否影响了正常的状态管理流程。

如果上述检查均无误,但问题依旧存在,可能是系统或框架的bug。此时,建议直接联系官网客服进行反馈和查询。

官网客服地址:https://www.itying.com/category-93-b0.html

回到顶部