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

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


HarmonyOS
2024-05-23 23:02:42
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
post_cj

使用的核心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%') 
  } 
}
分享
微博
QQ
微信
回复
2024-05-24 22:35:08
相关问题
SnapShot定位,有人知道怎么处理
375浏览 • 1回复 待解决
有人知道社区怎么预约直播
1256浏览 • 1回复 已解决
有人知道怎么在markdown里面写目录
1108浏览 • 1回复 已解决
怎么压缩一个目录?有人知道
330浏览 • 1回复 待解决
有人知道轻量系统上怎么使用MQTT
1255浏览 • 2回复 已解决
有人知道关于页demo
388浏览 • 1回复 待解决
如何跳出ForEach,有人知道
590浏览 • 1回复 待解决
如何发送短信,有人知道?
551浏览 • 1回复 待解决
taskpool 使用问题,有人知道
389浏览 • 1回复 待解决
webview组件demo ,有人知道
418浏览 • 1回复 待解决
如何保存faultLogger ,有人知道
144浏览 • 1回复 待解决
有人知道JS menu如何隐藏
3086浏览 • 1回复 待解决
导包报错,有人知道原因
570浏览 • 1回复 待解决
clientid相关问题,有人知道
452浏览 • 1回复 待解决
有人知道发布页demo
423浏览 • 1回复 待解决
如何实现翻页功能,有人知道
571浏览 • 1回复 待解决
List组件性能问题,有人知道
589浏览 • 1回复 待解决
如何引用HSP库,有人知道?
547浏览 • 1回复 待解决
如何定义dialog动画,有人知道?
697浏览 • 1回复 待解决