不知不觉过了半年过去了,我也做了半年多Taro小程序开发支付宝和微信小程序。现在抽空整理下些那踩过的哪些坑,整理经验。当然我之前的一篇文章《Uniapp学习笔记》也纪录一些小程序的踩坑笔记,这里就不做记录。Taro与Uniapp一样,针对微信小程序与支付宝的小程序只做浅层摩平,一些问题也并得taro的问题,而是平台差异导致的,需开发者自行解决。
考虑个人的懒惰和经历有限,所以这边文章写的会比较粗糙,对问题的描述比较浅,主要是写给自己看的,不太推荐阅读。
<ScrollView/>
对于h5来说可以通过样式overflow: scroll
来控制滚动,但是小程序有<ScrollView>
组件。
overflow: scroll
来控制滚动,但是如果在微信小程序弹窗fixed
布局里面的内容如果想滚动就必须用<ScrollView/>
bindscrolltolower
、bindscrolltoupper
可能不会被触发,通过配置upper-threshold
、lower-threshold
的值,调大一些,一定程度缓解这种问题。scrollTop > X
显示某些内容(如导航头),反之不显示某些内容, 正确的做法是设置一个boolean
变量如 showNavTitle
, 在bindscroll
事件中进行判断,伪代码如下jsconst X = 100;
function bindscroll(e) {
if(e.detail.scrollTop >= X && !this.state.showNavTitle) {
this.setState({showNavTitle: true});
} else if(e.detail.scrollTop < X && this.state.showNavTitle) {
this.setState({showNavTitle: false});
}
}
ScrollView
重新渲染了,会导致scrollTop = 0
, 正确的做法(伪代码)如下jsimport React from 'react';
import {ScrollView} from '@tarojs/components';
let scrollTop = 0;
export default class Page extends React.Component {
bindscroll = (e) => {
scrollTop = e.detail.scrollTop;
}
render() {
return <ScrollView scroll-y={scrollTop} scroll={(e) => bindscroll(e)}>
...
</ScrollView>
}
}
对于h5开发可以通过e.stopPropagation()
阻止事件冒泡,但对于小程序来说不能在滚动或拖拽的过程中条件控制事件是否冒泡、是否阻止默认事件,必须提前声明。
但是taro3是一个运行时框架,在逻辑层实现了一套事件系统,包括事件触发和事件冒泡。
一半情况下,这套在逻辑层实现的小程序事件系统是可以正常工作的,事件毁掉能正常触发、冒泡、停止冒泡。
但是小程序模版中绑定的catchtouchmove
事件,除了可以阻止回调函数冒泡触发外,还能阻止试图的滚动穿透,这点Taro的事件系统是做不到的。
<View catchMove>..</View>
实测只在微信小程序有效touch-action: none
可解决支付宝小程序滚动击穿问题<PickerView>
、<PickerViewColumn>
一般情况下使用 Picker
、 <PickerView>
、<PickerViewColumn>
没啥问题,但也架不住业务的特殊逻辑,比如一个日期组件有日期列、小时列、分钟列, 最早时间、最晚时间、时间拨片是配置的。也就是说,波动小时列,分钟列的选项要重新计算,还要勾选之前的选项值(如果时间拨片是5的倍数),波动日期列也是一样。
但是微信的<PickerView>
有坑, 1> 只有初次渲染是可以设置选项值,2>不能手动设置选项值。
但是业务诉求要求动态设置分钟列,且勾选之前的值,这就貌似无解了,
但其实微信的<PickerView>
可以手动设置选项值的,知识有两个前提,必须先设置选项列,渲染后在设置选项值;必须在触发事件后的短暂时间内进行设置。伪代码如下
jsthis.setData({
days,
hours,
minutes,
}, () =>
this.setData({
value: ['2024.10.06', '08', '50'],
})
);
这样确实解决了微信小程序的问题,但是在taro框架中,还要增加额外逻辑,使它强制渲染
jsx{
[Date.now() + Math.random()].map((it) => <PickerViewColumn
key={it}
>
<view wx:for="{{dates}}" style="line-height: 30px">{{item}}</view>
</PickerViewColum>)
}
大问题解决了,但是支付宝小程序还有个小问题,由于支付宝小程序不支持组件上设置样式,导致日期、小时、分钟三列的宽度是均分的,如果我要显示 “10月6日(周日)”这样的文案, 只能根据文字长度缩小fontSize
了。
业务迭代中可能有这样的诉求,微信扫码打开微信小程序、支付宝扫码打开支付宝小程序、其他场景扫码(如浏览器)打开微信小程序,支持携带动态参数。
这里有一些坑
getCurrentInstance().router?.path
没有以'/'
开头。本文作者:郭郭同学
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!