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到达末尾位置后的行为。
【定位思路】
- 在开启Tabs滑动切换的前提下给Grid设置嵌套滚动选项;
- 使用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
更多关于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切换。