jsplumb+dragable+vue3 实现可拖拽的流程编辑
时间: 2023-09-14 21:08:17 浏览: 135
好的,以下是一个使用jsplumb+dragable+vue3实现可拖拽的流程编辑器的完整例子:
```vue
<template>
<div class="container" ref="container">
<div class="node" v-for="node in nodes" :key="node.id" :style="{ left: node.x + 'px', top: node.y + 'px' }" :data-id="node.id" v-draggable>
<div class="title">{{ node.title }}</div>
<div class="content">{{ node.content }}</div>
<div class="endpoint" :class="'endpoint-' + index" v-for="(endpoint, index) in node.endpoints" :key="index" :data-id="node.id + '-' + index"></div>
</div>
</div>
</template>
<script>
import { onMounted, ref } from 'vue';
import jsPlumb from 'jsplumb';
import 'jsplumb/dist/js/jsplumb.min.css';
import 'dragula/dist/dragula.min.css';
import dragula from 'dragula';
export default {
name: 'DraggableFlowchart',
setup() {
const container = ref(null);
const nodes = ref([
{
id: 'node1',
title: 'Node 1',
content: 'This is Node 1',
x: 100,
y: 100,
endpoints: [
['Right', { uuid: 'node1-right' }],
['Bottom', { uuid: 'node1-bottom' }],
],
},
{
id: 'node2',
title: 'Node 2',
content: 'This is Node 2',
x: 300,
y: 100,
endpoints: [
['Left', { uuid: 'node2-left' }],
['Bottom', { uuid: 'node2-bottom' }],
],
},
]);
onMounted(() => {
const instance = jsPlumb.getInstance({
// 设置连接线的样式
PaintStyle: {
strokeWidth: 2,
stroke: '#61B7CF',
},
// 鼠标悬停在连接线上的样式
HoverPaintStyle: {
strokeWidth: 3,
stroke: '#216477',
},
// 端点的样式设置
EndpointStyles: [
{ fill: '#61B7CF' },
{ fill: '#216477' },
],
// 鼠标悬停在端点上的样式
EndpointHoverStyles: [
{ fill: '#216477' },
{ fill: '#61B7CF' },
],
// 连接线的锚点,可以设置为不同的位置,例如左侧、右侧、中心等位置
Anchors: ['Right', 'Left', 'Top', 'Bottom'],
// 设置连接线的类型,可以设置为Bezier、Straight等类型
Connector: ['Bezier', { curviness: 150 }],
Container: container.value,
});
// 添加节点和端点
nodes.value.forEach((node) => {
instance.draggable(node.id);
node.endpoints.forEach((endpoint, index) => {
instance.addEndpoint(node.id, {
anchor: endpoint[0],
uuid: endpoint[1].uuid,
});
});
});
// 连接两个端点
instance.connect({
uuids: ['node1-right', 'node2-left'],
});
// 监听连接事件
instance.bind('connection', (info) => {
console.log(`Connection established: ${info.sourceId} -> ${info.targetId}`);
});
// 监听断开连接事件
instance.bind('connectionDetached', (info) => {
console.log(`Connection detached: ${info.sourceId} -> ${info.targetId}`);
});
// 监听删除连接事件
instance.bind('connectionDeleted', (info) => {
console.log(`Connection deleted: ${info.sourceId} -> ${info.targetId}`);
});
// 监听节点位置改变事件
instance.bind('drag', (info) => {
const node = nodes.value.find((n) => n.id === info.el.getAttribute('data-id'));
node.x = info.pos[0];
node.y = info.pos[1];
});
// 使用dragula库实现节点拖拽排序
const drake = dragula([container.value], {
moves(el, container, handle) {
return handle.classList.contains('title');
},
});
// 监听节点排序事件
drake.on('drop', () => {
console.log('Node order changed');
});
});
return {
container,
nodes,
};
},
};
</script>
<style>
.container {
width: 100%;
height: 100%;
position: absolute;
}
.node {
position: absolute;
background-color: #fff;
border: 1px solid #ddd;
border-radius: 5px;
padding: 10px;
cursor: move;
}
.title {
font-size: 16px;
font-weight: bold;
margin-bottom: 10px;
}
.content {
font-size: 14px;
margin-bottom: 10px;
}
.endpoint {
width: 10px;
height: 10px;
background-color: #61B7CF;
border-radius: 50%;
position: absolute;
}
.endpoint-0 {
right: -5px;
top: 50%;
transform: translateY(-50%);
}
.endpoint-1 {
left: -5px;
top: 50%;
transform: translateY(-50%);
}
.endpoint-2 {
right: 50%;
top: -5px;
transform: translateX(50%);
}
.endpoint-3 {
right: 50%;
bottom: -5px;
transform: translateX(50%);
}
</style>
```
在这个例子中,我们首先引入了`jsPlumb`和`dragula`库,并使用`onMounted`钩子来初始化一个`jsPlumb`实例和一个`dragula`实例。在实例化过程中,我们设置了连接线的样式、锚点、连接线类型等参数,然后添加了两个节点和它们的端点,并连接了这两个节点的端点。我们还为节点添加了拖拽和排序的功能,并且监听了连接、断开连接、删除连接和位置改变事件。
请注意,这只是一个简单的例子,仅用于演示如何使用`jsPlumb`和`dragula`实现可拖拽的流程编辑器。实际应用中,您可能需要更复杂的逻辑和交互来处理不同的情况。
阅读全文