HarmonyOS lazyForEach相关范例

lazyForEach相关范例

HarmonyOS
2天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zbw_apple

lazyForEach原理介绍 https://developer.huawei.com/consumer/cn/doc/best-practices-V5/bpta-best-practices-long-list-V5

demo示例:

interface listItem {
  money: string
  text: string
  title: string
  data: string
}

class StringData {
  money: string
  text: string
  title: string
  data: string
  constructor(money: string,text: string, title: string, data: string) {
    this.money = money;
    this.text = text;
    this.title = title;
    this.data = data;
  }
}

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);
  }

  public reloadData(): void {
    this.notifyDataReload();
  }
}

@Entry
@Component
struct Index {
  private title: string = '我的优惠券'
  private data: MyDataSource = new MyDataSource();
  @State listDate: listItem[] = [
    {
      money: '¥360',
      text: '满3500元立减',
      title: '限部分商品使用',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥250',
      text: '满2500元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥200',
      text: '满1800元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥150',
      text: '满1300元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥80',
      text: '满800元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥360',
      text: '满3500元立减',
      title: '限部分商品使用',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥250',
      text: '满2500元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥200',
      text: '满1800元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥150',
      text: '满1300元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥80',
      text: '满800元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥360',
      text: '满3500元立减',
      title: '限部分商品使用',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥250',
      text: '满2500元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥200',
      text: '满1800元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥150',
      text: '满1300元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥80',
      text: '满800元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥360',
      text: '满3500元立减',
      title: '限部分商品使用',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥250',
      text: '满2500元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥200',
      text: '满1800元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥150',
      text: '满1300元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥80',
      text: '满800元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥360',
      text: '满3500元立减',
      title: '限部分商品使用',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥250',
      text: '满2500元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥200',
      text: '满1800元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥150',
      text: '满1300元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥80',
      text: '满800元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥360',
      text: '满3500元立减',
      title: '限部分商品使用',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥250',
      text: '满2500元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥200',
      text: '满1800元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥150',
      text: '满1300元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    },
    {
      money: '¥80',
      text: '满800元立减',
      title: '适用于体验',
      data: '2024.02.23-2024.03.15'
    }
  ]

  aboutToAppear(): void {
    // 请求数据模拟
    for (let i = 0; i <= this.listDate.length; i++) {
      this.data.pushData(new StringData(this.listDate[i].money,this.listDate[i].text,this.listDate[i].title,this.listDate[i].data));
    }
    console.log(JSON.stringify(this.data),'[Log]')
  }

  build() {
    Column() {
      Text(this.title)
        .fontSize(18)
        .fontWeight(FontWeight.Bold)
        .fontFamily('Arial')
      Row() {
        TextInput({ placeholder: '请输入优惠码' })
          .width('75%')
          .fontColor(Color.Blue)
          .fontSize(14)
          .fontStyle(FontStyle.Italic)
          .fontWeight(FontWeight.Bold)
          .fontFamily('Arial')
          .placeholderColor(0x999999)
          .placeholderFont({ size: 16, weight: FontWeight.Medium, family: 'cursive', style: FontStyle.Italic })
        Button('添加',{ type: ButtonType.Normal, stateEffect: true })
          .width('25%')
          .fontSize(14)
          .fontWeight(FontWeight.Medium)
          .backgroundColor('#cccccc')
          .borderRadius(5)
      }
      .padding({ top: 35, bottom: 10})

      Row() {
        Text(` 有${this.data.totalCount()}张优惠券可领用~`)
          .fontSize(12)
          .textAlign(TextAlign.End)
        Text('>')
      }
      .margin({bottom: 10})

      List({ space: 10 }) {
        LazyForEach(this.data, (item: listItem) => {
          ListItem() {
            Row() {
              Column() {
                Text(item.money)
                  .margin({top:20, bottom: 20})
                  .fontColor('#f9f4d7')
                  .borderRadius(5)
                Text(item.text)
                  .textAlign(TextAlign.Center)
                  .fontSize(12)
                  .fontColor('#f9f4d7')
                  .borderRadius(5)
              }
              .width('30%')
              .height(100)
              .backgroundColor('#fe6a48')
              Column() {
                Row() {
                  Text(item.title)
                    .textAlign(TextAlign.Start)
                    .margin({top: 15, left: -110, bottom: 40})
                }
                Row() {
                  Text(item.data)
                    .fontSize(10)
                    .margin({left: -5, right: 25})
                  Button('去使用', { type: ButtonType.Capsule })
                    .width('32%')
                    .height(20)
                    .fontSize(12)
                    .fontColor('#f6a200')
                    .backgroundColor('#cccccc')
                    .borderColor('#f6a200')
                }
              }
              .width('70%')
              .height(100)
              .backgroundColor('#fff')
            }
          }
        })
      }
    }
    .padding(12)
    .height('100%')
    .backgroundColor(0xF1F3F5)
  }
}
分享
微博
QQ
微信
回复
2天前
相关问题
使用LazyForEach懒加载列表相关问题
876浏览 • 1回复 待解决
WaterFlow的使用范例有哪些?
935浏览 • 1回复 待解决
HarmonyOS LazyForEach
342浏览 • 1回复 待解决
HarmonyOS swiper + LazyForEach使用问题
313浏览 • 1回复 待解决
HarmonyOS LazyForEach问题刷新UI问题
38浏览 • 1回复 待解决
HarmonyOS lazyForeach嵌套视图问题
271浏览 • 1回复 待解决
HarmonyOS lazyForEach数据应用问题
38浏览 • 1回复 待解决
list 如何使用 lazyforeach
280浏览 • 1回复 待解决
LazyForEach如何添加数据?
2006浏览 • 1回复 待解决
ListItemGroup 和lazyforeach如何结合使用
637浏览 • 1回复 待解决
LazyForEach的使用限制有哪些?
596浏览 • 1回复 待解决
ListItemGroup 和Lazyforeach结合场景
1005浏览 • 1回复 待解决
首页LazyForEach predict耗时久分析
892浏览 • 1回复 待解决
HarmonyOS音频相关问题
541浏览 • 1回复 待解决
HarmonyOS RN相关问题
523浏览 • 1回复 待解决
HarmonyOS音频录制相关
363浏览 • 1回复 待解决
HarmonyOS CardRecognition相关问题
166浏览 • 1回复 待解决