vue实现滑动删除
Vue 实现滑动删除功能
滑动删除是移动端常见的交互方式,可以通过 Vue 结合手势事件实现。以下是两种常见实现方案:
使用第三方库(如 v-touch)
安装 v-touch 库:

npm install vue-touch@next
注册组件并实现滑动:
import VueTouch from 'vue-touch'
Vue.use(VueTouch, {name: 'v-touch'})
// 模板
<v-touch @swipeleft="onSwipeLeft(item)">
<div class="item">{{ item.text }}</div>
</v-touch>
// 方法
methods: {
onSwipeLeft(item) {
this.deleteItem(item)
}
}
原生实现方案
通过监听 touch 事件计算滑动距离:

<div
@touchstart="touchStart"
@touchmove="touchMove"
@touchend="touchEnd"
:style="{ transform: `translateX(${offsetX}px)` }"
>
<!-- 内容 -->
<button @click="confirmDelete">删除</button>
</div>
data() {
return {
startX: 0,
offsetX: 0,
deleteWidth: 80 // 删除按钮宽度
}
},
methods: {
touchStart(e) {
this.startX = e.touches[0].clientX
},
touchMove(e) {
const currentX = e.touches[0].clientX
this.offsetX = Math.min(0, currentX - this.startX)
},
touchEnd() {
if (Math.abs(this.offsetX) > this.deleteWidth/2) {
this.offsetX = -this.deleteWidth
} else {
this.offsetX = 0
}
},
confirmDelete() {
// 删除逻辑
}
}
CSS 过渡效果
添加平滑的滑动动画:
.item {
transition: transform 0.3s ease;
will-change: transform;
}
.delete-btn {
width: 80px;
background: #ff4444;
color: white;
}
列表项实现注意事项
当在列表中使用时,需要为每个项维护独立的滑动状态:
data() {
return {
items: [
{ id: 1, text: 'Item 1', offset: 0 },
{ id: 2, text: 'Item 2', offset: 0 }
]
}
}
性能优化建议
- 使用
will-change: transform提升动画性能 - 避免在频繁触发的 touchmove 事件中进行复杂计算
- 对于长列表,考虑使用虚拟滚动技术
以上方案可根据具体需求选择,第三方库方案更快捷,原生实现更灵活可控。






