HarmonyOS 鸿蒙Next懒加载的具体实践

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

HarmonyOS 鸿蒙Next懒加载的具体实践 我有一个页面,纵向布局,页面内容大致分为三个部分,从上到下分别为,

  1. 水平轮播图
  2. 水平轮播图
  3. 垂直可无限加载更多的list(首次请求时会获取到40张图片返回)

那么现在我需要在三个模块里面都应用上懒加载方式,目前我应该如何实现,以下是我的大致结构,但是会存在加载该页面的时候,模块3的懒加载无法生效,系统会默认把这40张图一次性全部加载了,我希望的是屏幕外的就不加载,按需加载,那么我应该如何实现

List(){
 ListItem() {
 // 模块1的轮播图懒加载
 }
 ListItem() {
 // 模块2的轮播图懒加载
 }
 ListItem() {
 // 模块3的轮播图懒加载
 Column() {
 Text('无限加载模块')
 WaterFlow() {
 LazyForEach()
 ...
 }
 }
}

一定要这种效果


更多关于HarmonyOS 鸿蒙Next懒加载的具体实践的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

arkts实现这个很简单。只需要在onScrollIndex事件更新list值就行了。往下拖的时候lastIndex<this.objArr.length进行数据请求就行。

.onScrollIndex((firstIndex: number, lastIndex: number)=>{
  if(this.objArr.length>=20) {
    if (lastIndex >= (this.objArr.length - 4)) {
      if (this.navSelect == 1) {
        if(this.taskLoad == true)
        {
          return;
        }
        this.taskCampListByProvince();
      }
      else if (this.navSelect == 2)
        if(this.taskLoad == true)
        {
          return;
        }
        this.taskCampListByCity();
    }
  }
})
taskCampListByProvince() {
  if(this.dataIsEnd)
    return;

  let params = "province=湖北省&&pageIndex="+this.pageIndex+"";
  let tCamp = new taskCamp();
  this.taskLoad = true;
  tCamp.campListByProvince(params, (data: http.HttpResponse) => {
    let resultObj = json.parse(data.result.toString()) as Array<object>;
    if(resultObj.length == 0)
      this.dataIsEnd = true;
    resultObj.forEach(
      (item)=>{
        this.objArr.push(item);
      }
    )
    this.pageIndex++;
    this.taskLoad = false;
  });
}

更多关于HarmonyOS 鸿蒙Next懒加载的具体实践的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


楼主你好,可以参考下面demo:

class MyDataSource implements IDataSource { private list: number[] = []

constructor(list: number[]) { this.list = list }

totalCount(): number { return this.list.length }

getData(index: number): number { return this.list[index] }

registerDataChangeListener(listener: DataChangeListener): void { }

unregisterDataChangeListener() { } }

@Entry @Component struct LazyForEachDemo { private list: MyDataSource2 = new MyDataSource2(); private swiperController: SwiperController = new SwiperController() private data: MyDataSource = new MyDataSource([])

@Builder itemHead(text: string) { Text(text) .fontSize(20) .backgroundColor(0xAABBCC) .width(‘100%’) .padding(10) }

@Builder itemFoot(num: number) { Text(‘共’ + num + ‘节课’) .fontSize(16) .backgroundColor(0xAABBCC) .width(‘100%’) .padding(5) }

aboutToAppear() { for (let date = 1; date < ~~(Math.random() * 30) + 3; date++) { let dayData = new dateListItem(date + ‘’); for (let index = 1; index < ~~(Math.random() * 100) + 30; index++) { dayData.orderList.pushData(hello${index}); } this.list.pushData(dayData); }

let list: number[] = []
for (let i = 1; i <= 10; i++) {
  list.push(i);
}
this.data = new MyDataSource(list)

}

build() { Column() { Swiper(this.swiperController) { LazyForEach(this.data, (item: string) => { Text(item.toString()) .width(‘90%’) .height(160) .backgroundColor(0xAFEEEE) .textAlign(TextAlign.Center) .fontSize(30) }, (item: string) => item) } .displayCount(3, true) .autoPlay(true) .interval(4000) .loop(true) .duration(1000) .itemSpace(10) .indicator( // 设置圆点导航点样式 new DotIndicator() .itemWidth(15) .itemHeight(15) .selectedItemWidth(15) .selectedItemHeight(15) .color(Color.Gray) .selectedColor(Color.Blue)) .margin(5)

  Swiper(this.swiperController) {
    LazyForEach(this.data, (item: string) => {
      Text(item.toString())
        .width('90%')
        .height(160)
        .backgroundColor(0xAFEEEE)
        .textAlign(TextAlign.Center)
        .fontSize(30)
    }, (item: string) => item)
  }
  .displayCount(3, true)
  .autoPlay(true)
  .interval(4000)
  .loop(true)
  .duration(1000)
  .itemSpace(10)
  .indicator( // 设置圆点导航点样式
    new DotIndicator()
      .itemWidth(15)
      .itemHeight(15)
      .selectedItemWidth(15)
      .selectedItemHeight(15)
      .color(Color.Gray)
      .selectedColor(Color.Blue))

  List({ space: 20 }) {
    LazyForEach(this.list, (item: dateListItem) => {
      ListItemGroup({ header: this.itemHead(item.date + ''), footer: this.itemFoot(item.orderList.totalCount()) }) {
        LazyForEach(item.orderList, (order: string,) => {
          ListItem() {
            Text(order)
              .width('100%')
              .height(60)
              .fontSize(20)
              .textAlign(TextAlign.Center)
              .backgroundColor(0xFFFFFF)
          }
        }, (item: string) => JSON.stringify(item))
      }
      .divider({ strokeWidth: 1, color: Color.Blue })
    })
  }
  .height('100%')
  .cachedCount(1)
  .width('90%')
  .sticky(StickyStyle.Header | StickyStyle.Footer)
  .scrollBar(BarState.Off)
}
.width('100%')
.height('100%')
.backgroundColor(0xDCDCDC)
.padding({ top: 5 })

} }

class BasicDataSource implements IDataSource { private listeners: DataChangeListener[] = []; private originDataArray: string[] = [];

public totalCount(): number { return 0; }

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

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

unregisterDataChangeListener(listener: DataChangeListener): void { const pos = this.listeners.indexOf(listener); if (pos >= 0) { 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); }) } }

class MyDataSource1 extends BasicDataSource { private dataArray: string[] = [];

public totalCount(): number { return this.dataArray.length; }

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

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

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

class MyDataSource2 extends BasicDataSource { private dataArray: dateListItem[] = [];

public totalCount(): number { return this.dataArray.length; }

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

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

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

class dateListItem { date: string; orderList: MyDataSource1;

constructor(date: string) { this.date = date; this.orderList = new MyDataSource1(); } }


按照您说的轮播图您可以使用两个Swiper,参考链接:[https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-container-swiper-V5](https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-container-swiper-V5)

然后懒加载的话,您可以参考:[https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-rendering-control-lazyforeach-0000001820879609](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-rendering-control-lazyforeach-0000001820879609)

HarmonyOS 鸿蒙Next懒加载的具体实践主要依赖于其组件化框架和生命周期管理机制。懒加载是一种优化技术,用于延迟加载非关键资源或数据,直到它们实际需要被展示或使用时才进行加载,从而提升应用的性能和用户体验。

在HarmonyOS中,懒加载通常应用于图像、列表项、模块等组件。实现懒加载的关键在于监听组件的可见性状态,并在组件变得可见时触发数据或资源的加载。

具体来说,可以通过以下步骤实现懒加载:

  1. 定义懒加载组件:在XML布局文件中定义需要懒加载的组件,如Image、List等。

  2. 实现可见性监听:利用HarmonyOS提供的组件生命周期回调或自定义监听器,监听组件的可见性变化。当组件变为可见时,触发加载逻辑。

  3. 数据或资源加载:在组件可见时,通过网络请求、本地文件读取等方式加载所需的数据或资源。

  4. 更新UI:加载完成后,使用数据或资源更新组件的UI展示。

需要注意的是,懒加载的实现可能因具体应用场景和组件类型的不同而有所差异。开发者应根据实际需求灵活调整懒加载策略。

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

回到顶部