在HarmonyOS NEXT开发中Scroll是否支持onendreachedthreshold,配合endreached事件使用, 距离底部多少触发 endreached 事件?

在HarmonyOS NEXT开发中Scroll是否支持onendreachedthreshold,配合endreached事件使用, 距离底部多少触发 endreached 事件?

阅读 1.2k
avatarAI BotBETA

在 HarmonyOS NEXT 的 ArkUI 开发中,Scroll 组件支持通过 reachEndThreshold 属性配合 onReachEnd 事件实现滚动到底部触发的逻辑(而非 onEndReachedThresholdendreached 的命名)。

具体用法:

  1. onReachEnd 事件:当滚动到底部(或距离底部指定阈值时)触发。
  2. reachEndThreshold 属性:设置触发 onReachEnd 的距离阈值,单位为 vp(虚拟像素)。例如:

    Scroll() {
      // 内容...
    }
    .onReachEnd(() => {
      // 触发加载更多等逻辑
    })
    .reachEndThreshold(50) // 距离底部 50vp 时触发

注意:

  • 默认阈值0vp(滚动到严格底部才触发)。
  • 该机制常用于滚动到底部自动加载更多数据的场景。
  • 确保 Scroll 内容高度足够(或设置固定高度),否则可能无法触发。
1 个回答

组件实现可通过判断偏移量来实现,demo如下:

import display from '@ohos.display'; 
 
@Entry 
@Component 
struct page240510141709017 { 
  scroller: Scroller = new Scroller() 
  @State yOffset: number = 0 
  @State yPosition: number = 150 
  private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
  private childH: number = 0 
  private screenH: number = 0 
 
  build() { 
    Column() { 
      Scroll(this.scroller) { 
        Column() { 
          ForEach(this.arr, (item: number) => { 
            Text(item.toString()) 
              .width('90%') 
              .height(150) 
              .backgroundColor(0xFFFFFF) 
              .borderRadius(15) 
              .fontSize(16) 
              .textAlign(TextAlign.Center) 
              .margin({ top: 10 }) 
          }, (item: string) => item) 
        } 
        .width('100%') 
        .onAppear(() => { 
          this.childH = this.scroller.getItemRect(0).height 
          console.log('this.childH', this.childH) 
        }) 
      } 
      .scrollable(ScrollDirection.Vertical) // 滚动方向纵向 
      .scrollBar(BarState.On) // 滚动条常驻显示 
      .scrollBarColor(Color.Gray) // 滚动条颜色 
      .scrollBarWidth(10) // 滚动条宽度 
      .friction(0.6) 
      .edgeEffect(EdgeEffect.None) 
      .width('100%') 
      .height('100%') 
      .onDidScroll(() => { 
        if (!this.screenH) { 
          let displayClass: display.Display | null = null; 
          displayClass = display.getDefaultDisplaySync() 
          this.screenH = px2vp(displayClass.height) 
          console.log('this.screenH', this.screenH) 
        } 
        const yCurrentOffset = this.scroller.currentOffset().yOffset 
        console.log('yCurrentOffset', yCurrentOffset) 
        if (yCurrentOffset < 100) { 
          console.log('is < top 100') 
        } else if (yCurrentOffset > this.childH - this.screenH - 100) { 
          console.log('is > bottom 100') 
        } 
      }) 
    }.width('100%').height('100%').backgroundColor(0xDCDCDC) 
  }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进