下拉加载新页签,有人知道怎么处理吗?

使用Tabs组件时,初始化创建了两个页签(页签A和页签B),页签A包含广告轮播组件,页签B包含视频播放组件。下拉刷新时,会多一个页签C。现在希望刷新后,页签A和页签B不重新创建,还是沿用初始化创建的,同时里面的内容页也不刷新。


HarmonyOS
2024-05-23 23:02:42
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
南风春和

使用的核心API

Refresh:可以进行页面下拉操作并显示刷新动效的容器组件。

ForEach:在ForEach组件进行非首次渲染时,它会检查新生成的键值是否在上次渲染中已经存在。如果键值不存在,则会创建一个新的组件;如果键值存在,则不会创建新的组件,而是直接渲染该键值所对应的组件。

核心代码解释

主要是通过ForEach以及Refresh来达到tabs下拉加载新页签效果,代码如下:

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 TabsExample { 
  @State fontColor: string = '#182431' 
  @State selectedFontColor: string = '#007DFF' 
  @State currentIndex: number = 0 
  private TabsController: TabsController = new TabsController() 
  
  // 视频 
  private VideoController: VideoController = new VideoController() 
  
  @State isRefreshing: boolean = false 
  
  @Builder TabBuilder(index: number, name: string) { 
    Column() { 
      Text(name) 
        .fontColor(this.currentIndex === index ? this.selectedFontColor : this.fontColor) 
        .fontSize(16) 
        .fontWeight(this.currentIndex === index ? 500 : 400) 
        .lineHeight(22) 
        .margin({ top: 17, bottom: 7 }) 
      Divider() 
        .strokeWidth(2) 
        .color('#007DFF') 
        .opacity(this.currentIndex === index ? 1 : 0) 
    }.width('100%') 
  } 
  @State simpleList: Array<string> = ['页面A', '页面B']; 
  @State colorList: Array<string> = ['#ffd23737', '#ff6ee566', '#ff393fb5','#ffb5a039']; 
  
  // 轮播组件 
  private swiperController: SwiperController = new SwiperController() 
  private data: MyDataSource = new MyDataSource([]) 
  
  aboutToAppear(): void { 
    let list: number[] = [] 
    for (let i = 1; i <= 10; i++) { 
      list.push(i); 
    } 
    this.data = new MyDataSource(list) 
  } 
  
  build() { 
    Column() { 
      Refresh({ refreshing: $$this.isRefreshing}) { 
        Tabs({ barPosition: BarPosition.Start, controller: this.TabsController }) { 
          ForEach(this.simpleList, (item: string,index:number) => { 
            TabContent() { 
              Column(){ 
                if(index===0){ 
                  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) 
                  } 
                  .cachedCount(2) 
                  .autoPlay(true) 
                  .interval(4000) 
                  .loop(true) 
                  .duration(1000) 
                  .itemSpace(0) 
                  .indicator( // 设置圆点导航点样式 
                    new DotIndicator() 
                      .itemWidth(15) 
                      .itemHeight(15) 
                      .selectedItemWidth(15) 
                      .selectedItemHeight(15) 
                      .color(Color.Gray) 
                      .selectedColor(Color.Blue)) 
                }else if(index===1){ 
                  Video({ 
                    src: 'https://media.w3.org/2010/05/sintel/trailer.mp4', 
                    controller: this.VideoController 
                  }) 
                    .width('100%') 
                    .height(300) 
                    .autoPlay(true) 
                    .controls(true) 
                }else{ 
                  Text(item) 
                } 
              } 
              .backgroundColor(this.colorList[index]) 
              .width('100%').height('100%') 
            }.tabBar(this.TabBuilder(index, item)) 
          }, (item: string) => item) 
        } 
        .vertical(false) 
        .barMode(BarMode.Fixed) 
        .barWidth(360) 
        .barHeight(56) 
        .animationDuration(0) 
        .onChange((index: number) => { 
          this.currentIndex = index 
        }) 
        .width(360) 
        .height(296) 
        .backgroundColor('#F1F3F5') 
  
      } 
      .onStateChange((refreshStatus: RefreshStatus) => { 
        console.info('Refresh onStatueChange state is ' + refreshStatus) 
      }) 
      .onRefreshing(() => { 
        setTimeout(() => { 
          this.isRefreshing = false 
          this.simpleList.push('页面C') 
        }, 2000) 
        console.log('onRefreshing test') 
      }) 
      .backgroundColor(0x89CFF0) 
  
    }.width('100%') 
  } 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
分享
微博
QQ
微信
回复
2024-05-24 22:35:08


相关问题
SnapShot定位,有人知道怎么处理
2056浏览 • 1回复 待解决
List局部刷新,有人知道怎么处理
1955浏览 • 1回复 待解决
怎么主动关闭键盘,有人知道
1066浏览 • 1回复 待解决
如何对网络图片处理有人知道
889浏览 • 1回复 待解决
怎么压缩一个目录?有人知道
1292浏览 • 1回复 待解决
有人知道关于页demo
1480浏览 • 1回复 待解决
clientid相关问题,有人知道
2773浏览 • 1回复 待解决
有人知道发布页demo
1688浏览 • 1回复 待解决
如何获取windowStage,有人知道
1576浏览 • 1回复 待解决
导包报错,有人知道原因
2009浏览 • 1回复 待解决
如何实现振动,有人知道
2023浏览 • 2回复 待解决
有人知道JS menu如何隐藏
5392浏览 • 1回复 待解决
有人知道
1563浏览 • 1回复 待解决
如何发送短信,有人知道?
2880浏览 • 1回复 待解决
webview组件demo ,有人知道
1671浏览 • 1回复 待解决
有人知道
1169浏览 • 1回复 待解决
如何保存faultLogger ,有人知道
1518浏览 • 1回复 待解决
如何跳出ForEach,有人知道
3004浏览 • 1回复 待解决