更新记录
1.0.0(2025-12-09) 下载此版本
首次发布
平台兼容性
uni-app(4.85)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | - | - | - | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | - | - | - | - | - | √ | - | - | - |
zero-drag 通用拖拽排序组件
一个功能强大、灵活易用的拖拽排序组件,支持单列、多列、图片等多种场景
- 🎉 初始发布 zero-drag 通用拖拽排序组件
- 🎯 多模式支持:单列(single)、网格(grid)、图片(image) 三种排序模式
- 🎨 高度自定义:支持自定义内容插槽,满足各种 UI 设计需求
- 🎮 拖拽手柄:单列模式支持拖拽手柄,提供精确的拖拽控制
- ⏱️ 长按拖拽:默认需长按 1 秒触发拖拽,避免与滚动操作冲突
- ⚙️ 灵活配置:支持自定义长按时长、即时拖拽等多种配置
- ➕ 增删功能:内置添加、删除功能,支持自定义删除确认逻辑
- 🖼️ 图片预览:图片模式支持点击预览功能
- 🎭 流畅动画:基于 movable-area/movable-view 实现,动画效果流畅自然
- ⚡ 性能优异:优化的代码结构,轻量高效
- 🔧 Vue 兼容:同时支持 Vue2 和 Vue3
📋 核心功能
拖拽能力
- 长按拖拽机制(可配置时长)
- 即时拖拽模式(编辑模式)
- 拖拽手柄支持(单列模式)
- 自定义拖拽参数(缩放、透明度、阻尼等)
布局模式
- 单列垂直布局
- 网格多列布局
- 图片画廊布局
- 自定义尺寸支持
交互功能
- 添加新项目
- 删除项目(支持确认)
- 拖拽排序
- 图片预览
🎯 使用场景
- ✅ 待办事项排序
- 📅 倒数日管理
- 🖼️ 相册排序
- 📋 自定义列表
- 🎨 网格布局编辑
- 📱 应用图标排序
使用方法
符合easycom组件模式, 导入 uni_modules 后直接使用即可
🚀 快速开始
基础用法 - 图片拖拽排序
<template>
<zero-drag v-model="imageList" mode="image"></zero-drag>
</template>
<script>
export default {
data() {
return {
imageList: [
'https://example.com/image1.jpg',
'https://example.com/image2.jpg',
'https://example.com/image3.jpg'
]
}
}
}
</script>
网格布局拖拽
<template>
<zero-drag
v-model="gridList"
mode="grid"
:columns="3"
:deletable="true"
:addable="true"
@add="handleAdd"
@delete="handleDelete">
<template #default="{ item }">
<view class="custom-item">
<text>{{ item.name }}</text>
</view>
</template>
</zero-drag>
</template>
<script>
export default {
data() {
return {
gridList: [
{ id: 1, name: '项目1' },
{ id: 2, name: '项目2' },
{ id: 3, name: '项目3' }
]
}
},
methods: {
handleAdd() {
this.gridList.push({
id: Date.now(),
name: '新项目'
})
},
handleDelete(index) {
console.log('删除索引:', index)
}
}
}
</script>
单列垂直列表拖拽(带拖拽手柄)
<template>
<zero-drag
v-model="todoList"
mode="single"
:single-item-height="100"
:deletable="true"
:show-drag-handle="true"
drag-handle-position="left">
<template #default="{ item, index }">
<view class="todo-item">
<text class="todo-title">{{ item.title }}</text>
<text class="todo-time">{{ item.time }}</text>
</view>
</template>
</zero-drag>
</template>
<script>
export default {
data() {
return {
todoList: [
{ title: '完成报告', time: '2023-12-01' },
{ title: '开会讨论', time: '2023-12-02' },
{ title: '代码审查', time: '2023-12-03' }
]
}
}
}
</script>
📖 API 文档
Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| v-model / modelValue | 绑定的数组数据 | Array | [] |
| mode | 模式:single(单列)、grid(网格)、image(图片) | String | 'grid' |
| disabled | 是否禁用拖拽(设为false时无需长按,立即启用拖拽) | Boolean | false |
| keyName | 从对象中读取的键名(用于图片地址或显示内容) | String | null |
| columns | 网格模式下的列数 | Number | 3 |
| single-item-height | 单列模式下的项高度(rpx) | Number | 120 |
| item-width | 自定义项宽度(rpx),设置后 columns 无效 | Number | 0 |
| item-height | 自定义项高度(rpx) | Number | 0 |
| gap | 项之间的间距(rpx) | Number | 20 |
| border-radius | 圆角(rpx) | Number | 10 |
| scale | 拖动时放大倍数 | Number | 1.05 |
| opacity | 拖动时不透明度 | Number | 0.8 |
| damping | 阻尼系数 | Number | 40 |
| max-count | 最大数量 | Number | 9999 |
| addable | 是否显示添加按钮 | Boolean | false |
| deletable | 是否显示删除按钮 | Boolean | false |
| show-drag-handle | 是否显示拖拽手柄(仅单列模式) | Boolean | false |
| drag-handle-position | 拖拽手柄位置:'left' / 'right' | String | 'left' |
| long-press-duration | 长按触发拖拽的时长(毫秒) | Number | 1000 |
| on-add | 自定义添加方法 | Function | null |
| on-delete | 自定义删除确认方法 | Function | null |
Events
| 事件名 | 说明 | 回调参数 |
|---|---|---|
| change | 排序变化时触发 | (newList) 新的排序数组 |
| add | 点击添加按钮时触发 | - |
| delete | 删除项时触发 | (index) 删除项的索引 |
Slots
| 插槽名 | 说明 | 参数 |
|---|---|---|
| default | 自定义项内容 | { item, index } |
| add | 自定义添加按钮内容 | - |
💡 使用技巧
1. 对象数组使用 keyName
如果数据是对象数组,使用 keyName 指定显示字段:
<zero-drag
v-model="list"
mode="image"
keyName="url">
</zero-drag>
<!-- list 数据结构 -->
[
{ id: 1, url: 'xxx.jpg', title: '图片1' },
{ id: 2, url: 'yyy.jpg', title: '图片2' }
]
### 2. 自定义删除确认
```vue
<zero-drag
:on-delete="confirmDelete">
</zero-drag>
<script>
methods: {
confirmDelete(done) {
uni.showModal({
content: '确定删除?',
success: (res) => {
if (res.confirm) {
done() // 确认后调用 done 执行删除
}
}
})
}
}
</script>
3. 拖拽手柄(单列模式专属)
在单列模式下,可以启用拖拽手柄,提供更精确的拖拽控制:
<zero-drag
v-model="list"
mode="single"
:show-drag-handle="true"
drag-handle-position="left">
<!-- 内容 -->
</zero-drag>
优点:
- 避免误触发拖拽
- 提供清晰的拖拽入口
- 区分拖拽和点击操作
手柄位置:
left:手柄在左侧(默认)right:手柄在右侧
4. 响应式更新
组件支持双向绑定,直接修改数组即可更新:
// 添加
this.list.push(newItem)
// 删除
this.list.splice(index, 1)
// 修改
this.list[index] = newItem
5. 自定义长按时长
根据实际需求调整长按触发拖拽的时长:
<!-- 快速拖拽:0.5秒 -->
<zero-drag
v-model="list"
:long-press-duration="500">
</zero-drag>
<!-- 默认:1秒 -->
<zero-drag v-model="list"></zero-drag>
<!-- 谨慎拖拽:2秒 -->
<zero-drag
v-model="list"
:long-press-duration="2000">
</zero-drag>
建议:
- 列表简单且需要频繁拖拽:0.5-0.8秒
- 常规使用场景:1秒(默认)
- 防止误操作场景:1.5-2秒
6. 即时拖拽模式(编辑模式)
某些场景下需要点击按钮进入编辑模式后立即启用拖拽,无需长按:
<template>
<view>
<button @click="isEditing = !isEditing">
{{ isEditing ? '完成' : '编辑' }}
</button>
<!-- 编辑模式下 disabled=false,无需长按即可拖拽 -->
<zero-drag
v-model="list"
:disabled="!isEditing"
:shake="isEditing">
</zero-drag>
</view>
</template>
<script>
export default {
data() {
return {
isEditing: false,
list: [/* 数据 */]
}
}
}
</script>
说明:
disabled=true(默认):需要长按才能拖拽disabled=false:立即启用拖拽,无需长按
📝 注意事项
- 依赖组件:需要安装
uni-icons组件 - 数组元素:确保数组元素具有唯一性,避免重复导致渲染问题
- 长按拖拽:默认需要长按 1 秒后才能拖拽,短按或滚动不会触发拖拽
- 即时拖拽:设置
disabled=false可跳过长按机制,实现即时拖拽(如编辑模式) - 性能优化:大数据量时建议分页或虚拟列表
- 手柄模式:单列模式启用手柄时,只能通过手柄拖拽,内容区域可正常点击
- 滚动与拖拽:长按期间不影响正常滚动,只有达到设定时长后才启用拖拽功能
插件预览:
![]()
预览的小程序不一定能及时更新当前插件

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 9162
赞赏 71
下载 11867577
赞赏 1818
赞赏
京公网安备:11010802035340号