微信小程序swiper组件设置滚动监听(bindchange)导致swiper item闪烁、跳动、卡住BUG。

最近在使用swiper的时候,下拉刷新后导致swiper item不断的跳动卡住。

一开始以为是下拉刷新导致的,后面在开发社区看到相关的问题,是由于swiper导致的。

在手动滑动swiper时打出以下消息:

而自动轮播的detail->source 是autoplay

 

在拖动的时候和自动轮播产生了冲突,导致setData方法不断被调用。所以swiper item会反复的切换current,就产生了来回抖动的问题。

解决办法:

我直接不设置current,以上代码是去掉current后成功执行的代码。

这样即使手动或者自动滑动设置的current也不会影响到swiper item。

而且我也并没有需要使用到设置 swiper current的地方。

主要坑就是复制以前的代码。当时没注意哪里需要设置current。

在这里只是获取了current,用来设置自定义的indicator-dots

总结一下:如果要控制current 最好是autoplay没开启的情况下使用。

### 微信小程序 Swiper 组件滑动卡顿解决方案 #### 使用 `bindanimationfinish` 替代默认事件处理逻辑 为了有效解决微信小程序中的 Swiper 组件滑动卡顿问题,可以考虑采用 `bindanimationfinish` 作为替代方案。当 Swiper 发生卡顿时,该事件依旧会被触发,从而允许开发者在此基础上调整当前显示项的索引值[^3]。 ```html <swiper bindanimationfinish="changeGoodsSwip" current="{{goodsIndex}}"> </swiper> ``` #### 防止 Swiper 控件卡死的方法 针对可能出现的 Swiper 卡死情况,在检测到异常状态时应立即重置其内部索引至合理位置: - 当前页面索引为起始位且实际滚动超过一位时,则强制刷新当前索引; - 正常情况下则依据传入参数更新最新页码信息。 这种方法能够有效地预防因程序错误而导致的无限循环或无法响应等问题发生[^1]。 ```javascript // 轮播图切换 swiperChange(e){ if (this.data.current === 0 && this.data.swiperCurrent > 1) { // 卡死时,重置current为正确索引 this.setData({ swiperCurrent: this.data.swiperCurrent, }); } else { // 正常轮转时,记录正确页码索引 this.setData({ swiperCurrent: e.detail.current, }); } ``` #### 处理未知原因引发的抖动 Bug 对于由不明因素造成的频繁跳变现象,可以通过监听 change 事件并检查 source 属性来加以区分。仅在接受到来自 autoplay 或 touch 的变更请求时才执行相应的数据同步操作,以此减少不必要的渲染次数,提高用户体验质量[^4]。 ```javascript // 轮播change事件 swiperChange(e) { console.log(e); var _this = this; var swiperIndex = e.detail.current; var source = e.detail.source; if (source === 'autoplay' || source === 'touch') { _this.setData({ swiperIndex: swiperIndex }); } ``` 通过上述措施综合应用,可以在很大程度上改善微信小程序Swiper 组件存在的滑动不顺畅状况,提供更加稳定可靠的交互体验给用户。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值