场景一:滑动穿透问题
滑动穿透出现的场景:
<Scrollview scrollY style={height}>
</Scrollview>
出现滑动穿透的原因是,taro 3的事件冒泡机制是单独在小程序逻辑层实现,所有事件都是绑定的bind而不是catch,在touchmove事件回调中调用e.stopPropagation()并不能阻止滑动穿透,只会阻止上层组件的事件回调触发。 而是应该在View组件中添加catchMove属性,只要该属性值为true,就会使用catchTouchmove代替bindTouchmove进行事件绑定,从而阻止滑动穿透。 解决:
<View catchMove>
<Scrollview scrollY style={height}>
</Scrollview>
</View>
场景二 更复杂一点的滑动穿透问题
实际项目中使用Scrollview的场景会更复杂,如多层Scrollview嵌套等等。 这里举一个例子,在场景一中,如果最外层的View添加了touch事件,那么仅靠添加catchMove属性是无法阻止滑动穿透的。
<View
onTouchStart={handleMoveStart}
onTouchMove={handleMove}
onTouchEnd={handleEnd}
catchMove
>
<ScrollView scrollY style={height}>
</ScrollView>
</View>
注意,此时就算在外层的View里添加了catchMove,或者将内层的ScrollView的scrollY设置为false,都无法阻止滑动穿透现象。 这里提供两个解决方案: 1.控制外层View的onTouchStart事件,如果带有遮罩层的弹窗出现,则onTouchStart直接返回false,弹窗关闭之后执行原本的逻辑。 2.将带遮罩层的弹窗的代码放在整个View的外面。
<View
onTouchStart={handleMoveStart}
onTouchMove={handleMove}
onTouchEnd={handleEnd}
catchMove
>
<ScrollView scrollY style={height}>
</ScrollView>
</View>
场景三 使用两层scrollview的情况下,最里层的scrollview下的各种input,textarea的输入框内容发生错位
还原一下场景:
<View catchMove>
<Scrollview scrollY style={height}>
<AtFloatLayout>
<Input />
<Textarea />
</AtFloatLayout>
</Scrollview>
</View>
看一个效果图: 当我们把第一个scrollview的内容往下滚动后,打开AtFloatLayout里的内容,就会发现里面input和textarea中的placeholder和输入内容全部发生了错位,目前这个问题在华为的鸿蒙系统中必现。 关于这个问题的解决可以看一下微信社区,直接将最外层的scrollview的height改为其他值,不能用100vh。 scrollview里的input内容发生错位
实际上这个问题还有一种出现异常的场景:
<View catchMove>
<Scrollview scrollY style={height}>
<AtFloatLayout>
<Textarea style={height}/>
</AtFloatLayout>
</Scrollview>
</View>
在上面的例子中,Textarea有指定的高度,超出高度后Textarea就会自动滚动,这是原以为的情况。 实际上在ios系统中,如果最外层加了catchMove,就会阻止里面Textarea的滑动。但是如果不加最外层的catchMove,就无法阻止滑动穿透问题。 解决方案:将Textarea的height调大点,使其不用滑动,退而求其次的解决方案。。。
|