uni-list 不支持侧滑删除,需改用 uni-swipe-action;该组件兼容多端,通过 right/left 配置菜单,监听 @click 获取 content 值,注意 key 稳定性及平台差异。

uni-app 中 uni-list 组件不支持原生侧滑删除
直接用 uni-list + uni-list-item 是无法触发左滑菜单的——它只是个样式封装组件,没内置滑动手势逻辑和菜单渲染。真要实现侧滑删除,得换思路:要么手写滑动逻辑,要么用官方更底层的 uni-swipe-action。
推荐方案:用 uni-swipe-action 替代 uni-list-item
uni-swipe-action 是 uni-app 官方提供的、专为侧滑交互设计的容器组件,兼容 App、小程序、H5。它本身不依赖列表结构,但可以嵌在 uni-list 里作为子项使用。
实操要点:
- 每个列表项需包裹一层
<uni-swipe-action></uni-swipe-action>,再放<uni-swipe-action-item></uni-swipe-action-item>(左滑菜单)和内容区 -
right属性控制右侧按钮(如“删除”),left控制左侧(少见,一般不用) - 菜单按钮宽度默认 120px,可通过
width自定义,但 H5 端不生效 - 监听
@click事件时,参数是按钮的content值,不是索引,所以记得在按钮上加唯一标识(比如:content="`delete_${index}`")
示例片段:
<uni-swipe-action><uni-swipe-action-item right-width="120" :right="[{ content: '删除', style: { background: '#dd524d' } }]>
<view class=" list-item>{{ item.text }}
</uni-swipe-action-item></uni-swipe-action>
手写滑动逻辑容易踩的坑
有人想用 @touchstart/@touchmove 自己算位移做侧滑,但实际落地问题很多:
- 小程序端
touchmove事件频繁触发且坐标不准,容易误判为滑动,反而影响正常滚动 - App 端需要手动阻止父容器滚动(
event.preventDefault()),但 H5 端又不能随便阻止,否则页面滚不动 - 动画卡顿:用
transform: translateX()做位移时,若没加will-change: transform或未启用硬件加速,iOS 下尤其卡 - 松手后回弹逻辑难写准:得判断滑动距离是否超过阈值(比如 80px),还要结合速度做惯性估算,否则体验生硬
性能与兼容性注意点
uni-swipe-action 在不同平台表现有差异:
- 微信小程序:支持良好,但左滑菜单出现时会短暂“闪一下”,是 canvas 渲染导致,无法避免
- App(nvue):性能最好,滑动顺滑,但需确保外层容器没有
overflow: hidden,否则菜单被裁切 - H5:滑动响应偏慢,且不支持自定义菜单宽度(
width属性无效),建议 H5 端降级为点击“…” 弹出操作菜单 - 如果列表项用了
v-for,务必给key绑定稳定值(如:key="item.id"),否则侧滑状态容易错乱
侧滑删除真正麻烦的不是“怎么删”,而是“删完之后怎么同步 UI 状态”——比如动画未结束就快速连点,或删除中途用户又点其他项,这些边界情况比手势本身更难处理。











