HarmonyOS鸿蒙Next中如何解决Tabs组件在嵌套Grid组件后,无法触发Tabs滑动的问题

HarmonyOS鸿蒙Next中如何解决Tabs组件在嵌套Grid组件后,无法触发Tabs滑动的问题

【问题现象】

Tabs组件嵌套Grid组件,当Grid组件滑动到右侧底部时,无法触发Tabs组件的滑动。

如下图所示,使用手指左滑页面中的2行icon,预期触发tab从“首页1”切换到“首页2”,实际未触发。

点击放大

【背景知识】

  • 属性:

    TabsController:用于控制Tabs组件进行内容页切换;

    nestedScroll:设置Grid向前向后两个方向上的嵌套滚动模式,实现与父组件的滚动联动。

  • 事件:

    onScrollFrameBegin:Grid开始滑动时触发,Grid按照该事件返回值的实际滑动量进行滑动;

    onScrollStop:Grid滑动停止时触发,可设置Grid停止滑动后的行为;

    onReachStart:Grid到达起始位置时触发,可设置Grid回到初始位置后的行为;

    onReachEnd:Grid到达末尾位置时触发,可设置Grid到达末尾位置后的行为。

【定位思路】

  1. 在开启Tabs滑动切换的前提下给Grid设置嵌套滚动选项;
  2. 使用Grid的事件来设定滑动到边界时的行为。

【解决方案】

  • 方法一

给Grid设置嵌套滚动选项,同时将Tabs的滑动属性设置为True。

Tabs({
   ForEach(this.exampleModel, (model: exampleModel, index: number) => {
     TabContent() {
       Grid() {}
       .nestedScroll({ // 设置Grid的嵌套滚动
         scrollForward: NestedScrollMode.SELF_FIRST,
         scrollBackward: NestedScrollMode.SELF_FIRST,
       })
     }
   })
 .scrollable(true) // 开启Tabs的滑动
  • 方法二

使用Grid的事件来控制滑动的效果:用onScrollFrameBegin获取Grid的实际滑动量以及当前的滑动状态、onScrollStop设置Grid停止滑动后的行为、onReachStart设置Grid滑动到左侧时的行为、onReachEnd设置Grid滑动到左侧时的行为。

结合以上说明,要在onScrollStop钩子中处理tabs切换:

Grid(){
   ForEach(this.exampleList, (item: Resource, index: number) => {
     GridItem() {}
   })
 }
 .onReachEnd(() => {}) // 达到最右侧
 .onReachStart(() => {}) // 达到最左侧
 .onScrollFrameBegin((offset: number, state: ScrollState) => {}) // 获取实际滑动量以及当前滑动状态
 .onScrollStop(() => {}) // 通过判断Grid是否达到边界以及当前的滑动状态决定Grid停止滑动后是否切换Tab

【效果展示】

运行代码可以发现已经实现了嵌套滑动效果:

点击放大

点击放大

【总结】

以上两种方法都可以实现嵌套滑动效果,但方法一在快速滑动时容易直接滑动到下一个TabContent,造成误触,因此推荐使用方法二。


更多关于HarmonyOS鸿蒙Next中如何解决Tabs组件在嵌套Grid组件后,无法触发Tabs滑动的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中如何解决Tabs组件在嵌套Grid组件后,无法触发Tabs滑动的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


给Grid设置嵌套滚动选项

同时将Tabs的滑动属性设置为True。使用Grid的事件来控制滑动的效果:

  • onScrollFrameBegin获取Grid的实际滑动量以及当前的滑动状态
  • onScrollStop设置Grid停止滑动后的行为
  • onReachStart设置Grid滑动到左侧时的行为
  • onReachEnd设置Grid滑动到右侧时的行为

onScrollStop钩子中处理Tabs切换。

回到顶部