uni-swipe-action在h5与小程序平台表现不一致,因底层依赖不同:h5依赖css transform且受父容器overflow/touch-action限制,小程序调用原生组件;需按平台差异配置样式、事件绑定及数据更新逻辑。

uni-swipe-action 在 H5 和小程序平台表现不一致
直接套用文档示例,在 H5 上可能完全不触发滑动,而在微信小程序里却正常——这不是代码写错了,是 uni-swipe-action 底层依赖平台原生能力:H5 版本靠 CSS transform 模拟,对父容器的 overflow、touch-action 敏感;小程序则调用原生滑动组件。
实操建议:
- 确保
uni-swipe-action的直接父元素没有设置overflow: hidden或touch-action: pan-y(H5 下会拦截横向 touch) - H5 端需在
pages.json中为对应页面开启"disableScroll": false(默认 true 会禁用 body 滚动,间接影响 swipe) - 微信小程序中,
uni-swipe-action必须放在scroll-view外部,否则滑动会被scroll-view吞掉 - App 端(vue2)需确认已启用
renderjs支持,否则滑动反馈卡顿或无响应
列表项里嵌套 uni-swipe-action 导致点击事件失效
常见现象:左滑出现操作按钮后,点击列表区域没反应,或者点一下就自动收起 swipe 区域。本质是 uni-swipe-action 默认拦截了所有 touchstart,且内部未透传 click 事件到子内容区。
实操建议:
- 给需要响应点击的子元素(如整个列表项容器)加
catch:tap或@tap.stop(vue2) /@tap.stop(vue3),避免事件冒泡被 swipe 拦截 - 不要把
@click绑在uni-swipe-action标签上,它不触发 click;应绑定在内部的view或text上 - 若需“点击列表项跳转 + 左滑删除”,建议把跳转逻辑写在
uni-swipe-action内部的占位view上,并用catch:tap阻断 swipe 的默认行为 - 慎用
disabled属性动态控制 swipe 开关——它会卸载/重载组件,导致列表滚动错乱
uni-swipe-action 的 options 参数在不同平台渲染差异大
options 里的 text、style、color 在 H5 上基本生效,但在微信小程序中仅支持 text 和 backgroundColor,其他样式(如 fontSize、borderRadius)会被忽略;支付宝小程序甚至不支持 color 字段。
实操建议:
- 不要在
options里写复杂样式,统一用class+ 平台条件编译控制外观 - 微信小程序中,
backgroundColor接受十六进制(如"#e64340"),但不接受 rgb/rgba,也不支持变量绑定(必须字符串字面量) - 如果要实现图标 + 文字按钮,得用
slot="right"自定义内容,而非依赖options - 动态生成
options时注意:数组长度不能为 0,否则某些平台(如 App)会报Cannot read property 'length' of undefined
滑动删除后列表数据更新,但 UI 没刷新或出现空白项
典型错误是直接用 splice 删除数组项,但未触发响应式更新(尤其在 Vue2 + Options API 场景下),或在 uni-swipe-action 的 @close 回调里异步删数据却没等 DOM 收起完成,导致 swipe 区域残留或高度塌陷。
实操建议:
- Vue2 中,用
this.$set(this.list, index, newValue)或this.list.splice(index, 1)后手动调用this.$forceUpdate()(仅当响应式失效时) - 推荐统一用
ref+reactive(vue3)或Vue.set(vue2)保证响应性 - 删除操作务必放在
@confirm而非@close中执行——@close是用户松手后自动收起时触发,不代表用户点了删除 - 删除前可先
uni.showModal确认,回调里再调接口 + 更新本地数据,避免误操作不可逆
最易被忽略的一点:滑动删除动画本身由组件控制,你删了数据,但 swipe 组件内部状态(如是否展开)不会自动同步。所以别依赖「删完数据它就自动收起」,该调 ref.close() 就调,别省那一步。











