HarmonyOS鸿蒙Next中Swiper + LazyForEach想在LazyForEach中子组件的onAppear方法中请求接口,接口请求成功后刷新当前页面,该如何实现呢?

HarmonyOS鸿蒙Next中Swiper + LazyForEach想在LazyForEach中子组件的onAppear方法中请求接口,接口请求成功后刷新当前页面,该如何实现呢?

Swiper(this.swiperController) {
  LazyForEach(this.dataSource, (item: ActivitiesListBean, index: number) => {
    this.detailItemLayoutBuilder(item, index)
  }, (item: ActivitiesListBean, index: number) => JSON.stringify(item) + index)
}
@Builder
detailItemLayoutBuilder(item: ActivitiesListBean, index: number) {
  RelativeContainer() {
    
    this.topLayoutBuilder(item)
    this.bottomLayoutBuilder(item)
  }
  .width('100%')
  .height('100%')
  .onAppear(async () => {
    
    await CheckCanRewardService.getRewardInfo(item.id, (result) => {
          // item.canRewardBean = result;
          //接口请求成功后,将结果赋值给 当前item,并刷新UI,盖如何实现呢?请各位老师赐教
    });
  })
}

更多关于HarmonyOS鸿蒙Next中Swiper + LazyForEach想在LazyForEach中子组件的onAppear方法中请求接口,接口请求成功后刷新当前页面,该如何实现呢?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复
this.dataSource.array[index].canRewardBean = result
this.dataSource.notifyDataChanged(index)

更多关于HarmonyOS鸿蒙Next中Swiper + LazyForEach想在LazyForEach中子组件的onAppear方法中请求接口,接口请求成功后刷新当前页面,该如何实现呢?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


使用@ObservedV2结合@Trace动态刷新页面

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  @State arr: Array<Item> = [new Item(1,"name1"),new Item(2,"name2"),new Item(3,"name3"),new Item(4,"name4")]

  build() {
    Column() {

      List() {
        ForEach(this.arr, (item:Item) => {
          ListItem() {
            Row() {
              Text(`第${item.id}个`)
              Text(`内容:${item.name}`)
            }
            //点击模拟数据变化
            .onClick(() =>{
              item.id++;
            })
          }
        })
      }

      Text("ceshi")
      Text("ceshi")
      Text("ceshi")
      Text(this.message)
        .id('HelloWorld')
        .fontSize($r('app.float.page_text_font_size'))
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          this.message = 'Welcome';
        })
    }
    .height('100%')
    .width('100%')
  }

}

[@ObservedV2](/user/ObservedV2)
class Item{
  [@Trace](/user/Trace) id:number = 0;
  name:string = "";

  constructor(id:number,name:string) {
    this.id = id;
    this.name = name;
  }
}

在HarmonyOS鸿蒙Next中,使用Swiper+LazyForEach时,要在子组件onAppear请求接口后刷新当前页面,可以这样做:

  1. 在子组件中定义回调函数,通过父组件传递
  2. 在onAppear中请求接口,成功后调用回调
  3. 父组件维护数据源,回调触发时更新数据源

关键代码示例:

// 子组件
@Builder
function ChildComponent(callback: () => void) {
  onAppear(() => {
    fetchData().then(() => callback())
  })
}

// 父组件
@State data: DataType[] = [...]

build() {
  Swiper() {
    LazyForEach(this.data, (item) => {
      ChildComponent(() => {
        // 更新数据源
        this.data = [...this.data]
      })
    })
  }
}

在HarmonyOS Next中,可以通过以下方式实现LazyForEach子组件onAppear请求接口后刷新UI:

  1. 首先确保dataSource是@State装饰的响应式数据源:
[@State](/user/State) dataSource: ActivitiesListBean[] = [];
  1. 在接口回调中更新数据并触发UI刷新:
.onAppear(async () => {
  await CheckCanRewardService.getRewardInfo(item.id, (result) => {
    // 更新对应item的数据
    this.dataSource[index].canRewardBean = result;
    // 通过数组解构触发数据更新
    this.dataSource = [...this.dataSource];
  });
})
  1. 或者使用@Observed@ObjectLink实现对象级别的响应式更新:
// 定义可观察类
[@Observed](/user/Observed)
class ActivitiesListBean {
  //...
}

// 组件中使用[@ObjectLink](/user/ObjectLink)
[@ObjectLink](/user/ObjectLink) item: ActivitiesListBean;

// 回调中直接修改属性即可自动刷新
item.canRewardBean = result;

注意:确保在LazyForEach的item生成函数中正确传递了index参数,这样才能在回调中定位到需要更新的具体数据项。

回到顶部