更新记录
1.0.1(2025-11-14)
添加子章节
1.0.0(2025-11-14)
init
平台兼容性
uni-app(4.84)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × |
uni-app x(4.84)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ |
el-dragX
一个支持三级拖拽排序的树形组件,适用于 uni-app-x 项目。
功能特性
- ✅ 三级拖拽排序:支持章节、节、小节三级结构,同级之间可拖拽排序
- ✅ 折叠展开:每级可独立折叠/展开
- ✅ 编辑功能:支持编辑标题,点击编辑按钮即可修改
- ✅ 添加功能:支持添加章节和子章节
- ✅ 删除功能:支持删除任意级别的节点
- ✅ 控制开关:可控制拖拽和编辑功能的开启/关闭
- ✅ 事件回调:提供丰富的事件回调,方便业务处理
安装使用
1. 导入组件
<template>
<view class="page-container">
<!-- 控制按钮区域 - 固定在顶部 -->
<view class="control-bar">
<view class="control-btn" :class="{'active': enableDrag}" @click="toggleDrag">
<text>拖拽</text>
</view>
<view class="control-btn" :class="{'active': enableEdit}" @click="toggleEdit">
<text>编辑</text>
</view>
<view v-if="enableEdit" class="control-btn add-chapter-btn" @click="handleAddChapterClick">
<text>添加章节</text>
</view>
</view>
<!-- 树形列表内容 - 可滚动 -->
<scroll-view class="scroll-container" scroll-y="true">
<el-drag-x
v-model="chapterList"
v-model:enableDrag="enableDrag"
v-model:enableEdit="enableEdit"
@edit="handleEdit"
@delete="handleDelete"
@regenerate="handleRegenerate"
@addRequirement="handleAddRequirement"
@addChild="handleAddChild"
@addChapter="handleAddChapter"
@change="handleChange"
/>
</scroll-view>
</view>
</template>
<script>
import ElDragX from '@/uni_modules/el-dragX/components/el-dragX/el-dragX.vue'
export default {
components: {
ElDragX
},
data() {
return {
enableDrag: true,
enableEdit: true,
chapterList: [
{
id: 1,
title: '第一章 很不错',
expanded: true,
children: [
{
id: 11,
title: '第一节 很不错',
expanded: true,
children: [
{ id: 111, title: '一、很不错' },
{ id: 112, title: '二、很不错' }
]
}
]
}
]
}
},
methods: {
toggleDrag() {
this.enableDrag = !this.enableDrag
},
toggleEdit() {
this.enableEdit = !this.enableEdit
},
handleAddChapterClick() {
const maxId = this.chapterList.length > 0
? Math.max(...this.chapterList.map(ch => ch.id || 0))
: 0
const newChapter = {
id: maxId + 1,
title: `第${this.chapterList.length + 1}章 新章节`,
expanded: true,
children: []
}
this.chapterList.push(newChapter)
},
handleEdit(data) {
console.log('编辑', data)
},
handleDelete(data) {
console.log('删除', data)
},
handleRegenerate(data) {
console.log('重新生成', data)
},
handleAddRequirement(data) {
console.log('添加要求', data)
},
handleAddChild(data) {
console.log('添加子章节', data)
},
handleAddChapter(data) {
console.log('添加章节', data)
},
handleChange(list) {
console.log('数据变化', list)
}
}
}
</script>
Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| modelValue | 数据列表,支持 v-model | Array | [] |
| enableDrag | 是否启用拖拽功能,支持 v-model | Boolean | true |
| enableEdit | 是否启用编辑功能,支持 v-model | Boolean | true |
Events
| 事件名 | 说明 | 回调参数 |
|---|---|---|
| update:modelValue | 数据变化时触发 | (list: Array) |
| change | 数据变化时触发 | (list: Array) |
| edit | 编辑完成时触发 | { item, oldTitle, newTitle, index, level, parentIndex, sectionIndex } |
| delete | 删除时触发 | { item, index, parentIndex, sectionIndex } |
| regenerate | 重新生成时触发 | { item, index, level, parentIndex, sectionIndex } |
| addRequirement | 添加要求时触发 | { item, index, level, parentIndex, sectionIndex } |
| addChild | 添加子章节时触发 | { item, parentItem, index, level, parentIndex, sectionIndex } |
| addChapter | 添加章节时触发 | { item, index } |
| update:enableDrag | 拖拽开关变化时触发 | (value: Boolean) |
| update:enableEdit | 编辑开关变化时触发 | (value: Boolean) |
数据结构
每个节点需要包含以下字段:
interface TreeNode {
id: number | string // 唯一标识
title: string // 标题
expanded?: boolean // 是否展开,默认 true
children?: TreeNode[] // 子节点数组
}
使用说明
拖拽排序
- 确保
enableDrag为true - 长按拖拽手柄(⋮⋮ 图标)
- 上下移动手指调整位置
- 松开手指完成排序
注意:
- 章节只能和章节调换位置
- 节只能在本章下的节之间调换位置
- 小节只能在本节下的小节之间调换位置
编辑标题
- 确保
enableEdit为true - 点击编辑按钮(✏️)
- 在输入框中修改标题
- 点击保存(✓)或按回车确认
- 点击取消(✕)取消编辑
添加节点
- 添加章节:点击顶部的"添加章节"按钮
- 添加子章节:点击对应行的"添加子章节"按钮
- 在章节下点击:添加新的节
- 在节下点击:添加新的小节
删除节点
点击删除按钮(🗑️)即可删除对应节点。
样式定制
组件使用 scoped 样式,如需定制样式,可以通过以下方式:
- 使用深度选择器覆盖样式
- 通过 CSS 变量定制(未来版本支持)
注意事项
- 数据项必须包含
id字段作为唯一标识 - 建议使用
scroll-view包裹组件以实现滚动功能 - 控制按钮建议放在组件外部,固定在页面顶部
- 拖拽功能在移动端使用触摸事件实现
兼容性
- uni-app-x 3.1.0+
- Vue 3
许可证
MIT

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 23
赞赏 0
下载 11033547
赞赏 1800
赞赏
京公网安备:11010802035340号