vue3+el-treee树形控件拖拽
时间: 2025-05-06 15:00:56 浏览: 15
### 实现 Vue3 中 Element Plus `el-tree` 的拖拽功能
为了实现在 Vue3 和 Element Plus 中的树形控件 (`el-tree`) 支持拖拽功能,可以采用第三方库 Sortable.js 来增强原生的功能。通过引入并配置该插件,能够轻松实现节点之间的交互操作。
#### 安装依赖包
首先,在项目中安装必要的 npm 包来获取所需的工具:
```bash
npm install sortablejs vue.draggable.next --save
```
#### 创建辅助函数文件
创建一个新的 JavaScript 文件用于定义帮助函数以便于后续调用。假设路径为 `/src/utils/treeDraggable.ts`:
```typescript
// /src/utils/treeDraggable.ts
import Sortable from 'sortablejs';
export function initTreeSortable(treeRef, options = {}) {
const treeEl = (treeRef as any).$el.querySelectorAll('.el-tree-node')[0];
new Sortable(treeEl.children[0], {
animation: 150,
ghostClass: "ghost",
onEnd({ newIndex, oldIndex }) {
if (newIndex !== undefined && oldIndex !== undefined) {
const targetNodeKey = Array.from(treeEl.children)[newIndex].dataset.key;
const currentNodeKey = Array.from(treeEl.children)[oldIndex].dataset.key;
// 调整实际的数据结构顺序
treeRef.store.nodesMap[targetNodeKey].parent.data.splice(newIndex, 0,
treeRef.store.nodesMap[currentNodeKey]);
treeRef.store.nodesMap[targetNodeKey].parent.data.splice(oldIndex < newIndex ? oldIndex : oldIndex + 1, 1);
}
},
...options
});
}
```
此代码片段实现了初始化树节点排序逻辑,并处理了当发生移动后的数据更新过程[^1]。
#### 修改组件模板部分
编辑包含 `el-tree` 组件的相关页面或模块内的 `<template>` 部分,确保给定唯一的 ref 属性值方便之后的操作引用:
```html
<template>
<!-- 其它 HTML 结构 -->
<div style="margin-top: 20px;">
<el-tree
ref="myTree"
:data="treeData"
node-key="id"
draggable
@node-drag-start="handleDragStart"
@node-drop="handleDrop">
</el-tree>
</div>
</template>
```
这里启用了内置的 `draggable` 特性和监听器事件以响应用户的动作[^2]。
#### 添加脚本逻辑
最后一步是在对应的 `.vue` 文件中的 `<script setup>` 块内编写业务逻辑,包括但不限于导入之前编写的实用程序以及设置生命周期钩子来进行动态加载等功能:
```javascript
<script lang="ts" setup>
import { ref, nextTick } from 'vue';
import { ElMessage } from 'element-plus';
import { initTreeSortable } from '@/utils/treeDraggable';
const myTree = ref(null); // 对应上面 template 中的 ref 名字
let treeData = [
/* 初始化时所需展示的数据 */
];
nextTick(() => {
if(myTree.value){
initTreeSortable(myTree.value);
}
});
function handleDragStart(node, ev) {
console.log('drag start', node);
}
function handleDrop(draggingNode, dropNode, type, event) {
ElMessage({
message: `${type}`,
type: 'success'
});
}
</script>
```
上述代码展示了如何利用自定义的帮助类完成对 `el-tree` 控制权扩展的同时保持良好的用户体验和性能表现[^3]。
阅读全文
相关推荐
















