uni-swipe-action在H5上不滑动主因是父容器overflow:hidden或touch-action:pan-y拦截事件,需设pages.json中"disableScroll":false、确保父元素无干扰样式、禁用scroll-view嵌套,并用splice更新列表、唯一key绑定。

uni-swipe-action 在 H5 上不滑动、无响应
直接复制文档示例,在浏览器里拉不动,大概率是父容器拦住了 touch 事件。H5 版靠 CSS transform 模拟滑动,对 touch-action 和 overflow 极其敏感。
实操建议:
- 检查
uni-swipe-action的直接父元素是否设置了overflow: hidden或touch-action: pan-y—— 这俩在 iOS Safari 和安卓部分 WebView 下会直接吞掉横向滑动手势 - H5 端必须在
pages.json对应页面配置:"disableScroll": false(默认为true,会禁用 body 滚动并间接干扰 swipe) -
uni-swipe-action-item必须设固定高度,例如height: 100rpx;禁用flex: 1或height: 100%,否则 H5 无法计算滑动边界 - 真机调试优先用 iOS Safari 或微信开发者工具,Chrome 模拟器常误判
touchstart
点击删除后列表没更新或状态错乱
常见现象:点了“删除”按钮,UI 没变;或者删了第 2 条,第 3 条的开关/选中状态跟着消失了。这不是渲染 bug,是数据和 key 绑定错了。
实操建议:
- 删除回调里必须显式修改原始数组,用
this.list.splice(index, 1),不能只改item.isDeleted = true—— Vue 2.x 对索引赋值不响应 -
v-for的:key必须用稳定唯一标识,例如:key="item.id";禁用:key="index",否则删除后 index 变动会导致 Vue 复用错误的 DOM 节点 - 如果删除涉及接口请求,建议先
splice更新 UI,再发请求;失败时用unshift或push恢复,避免卡在“半删除”状态 - 调用
uni.hideSwipeAction()(uni-app 3.99+ 支持),防止残留滑动状态干扰下一次交互
多个 swipe-item 共存时右滑触发页面返回
在华为 EMUI 或 iOS 微信里,左滑能打开菜单,但右滑却直接退出当前页 —— 这是系统级手势和组件手势冲突了。
实操建议:
- 在
pages.json中关闭对应页面的滑动返回:"disableScroll": true(防页面滚动干扰),同时确认"enablePullDownRefresh": false -
uni-swipe-action标签上显式加:disabled="false",避免父容器pointer-events: none或overflow: hidden意外拦截 touch - 如果页面用了
scroll-view,必须把uni-swipe-action移到它外面 ——scroll-view会吞掉内部所有 touchstart - 需要保留右滑返回?那就别在该页面用
uni-swipe-action的右侧按钮,只留左侧操作项
自定义按钮宽度和点击区域失效
默认按钮宽 120px,在 iPhone 上挤,在 Pad 上空;更麻烦的是,点了按钮没反应,或者点列表项区域也触发了收起。
实操建议:
- 按钮容器类名是
.uni-swipe-button-group,scoped 样式需用::v-deep(Vue 2)或:deep()(Vue 3)穿透 - 设宽度别用
width: 100vw(按父容器算),改用width: calc(100vw - 750rpx)粗略适配(750rpx 是 uni-app 设计基准) - 文字字号统一用
rpx,比如font-size: 28rpx,避免高 DPR 屏幕下糊成一团 - 给列表内容区加
@tap.stop(Vue 2)或@tap.stop(Vue 3),否则 click 会被 swipe 拦截;跳转逻辑要写在内部<view>上,而不是uni-swipe-action标签本身
实际项目里最常被忽略的,是 H5 和小程序对 touch 事件的处理差异 —— 同一套代码,H5 需要手动放开 touch-action,小程序却可能因 scroll-view 嵌套而彻底失灵。平台差异不是“兼容性问题”,而是底层机制不同,得分开调。


















