我与Taro和小程序恩怨纠纷系列(一) --滚动穿透

1,279 阅读2分钟

背景:业务开发中很多modal需要防止滚动穿透的需求,在taro3的早期版本由于设计问题并不支持。官方给出了以下两种解决方案。

摘自taro官网

方案测试

1、方案一:先说结论,大部分场景没有用,很多页面是长页面的需求,需要有长页面滚动和吸顶灯等交互,所以设置overflow:hidden;height: 100vh;会导致页面滚动到顶部。不建议采用

2、方案二:需要升级taro版本,对于使用了taro早期版本的项目并不友好。虽然taro支持了用命令taro update升级项目,但是会有一些依赖冲突导致编译问题。比如在taro项目中使用了style-component方案的linaria就会有难以解决的编译冲突问题(可能后续版本会解决,截止当前文案编辑未解决)。那么如果是新项目呢? 我用3.0.26版本的包测试了下(官方声明3.0.21版本开始支持)。是有效的。 如果项目升级过程没有问题的画就升级吧。

其他方案

1、ScrollView ,可以通过scrollY参数控制是否滚动,不过如果采用ScrollView的话会有布局,api,不可预测bug等其他原因。比如ScrollView可能会限制你滑动并且tab吸顶的布局,(电商等场景)。第二:pageScrollTo等api没失效。第三:很诡异,如果在ScrollView中使用Input,在滑动的时候会导致input中的文字乱串?(实际项目中遇到。确认是微信bug)

基于上面等原因和自己遇到的场景问题,最终采用一下方案

在taro内构建一个小程序原生的组件,用到原生的catchtouchmove事件。代码如下

//frozen-zero.wxml
<view id="{{id}}" class="'frozen-zero' {{className}}" catchtouchmove="move">  <slot></slot></view>//frozen-zero.json
{  "component": true,  "usingComponents": {}}//fronzen-zero.js
Component({  properties: {    id: {      type: String,      value: ''    },    className: {      type: String,      value: ''    }  },  methods: {    move: function() {}  }})//frozen-zero.wxss
.frozen-zero {  position: fixed;  top: 0;  bottom: 0;  left: 0;  right: 0;  z-index: 999;}

//使用
const demo = () => {
   const [needPreventrollingpenetration] = useState(true)   return needPreventrollingpenetration ? <frozen-zero>内容</frozen-zero> : <View>内容</View>
}

最后: 希望可以帮到处于水深火热之中的小程序开发者们。如果有其他困难场景欢迎留言