menu.vue
3.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<!--
* @Date: 2025-03-10 14:37:31
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-03-10 16:38:24
* @FilePath: /logic-flow2/src/views/menu.vue
* @Description: 文件描述
-->
<template>
<div class="container">
<div ref="container" class="flow-container"></div>
</div>
</template>
<script setup>
import LogicFlow from '@logicflow/core';
import { CustomNode, CustomModel } from '@components/logicflow/custom-node.js'; // 指定业务状态设置菜单
const container = ref(null);
let lf = null;
onMounted(() => {
lf = new LogicFlow({
container: container.value,
grid: true,
});
// 为菜单追加选项(必须在 lf.render() 之前设置)
// 或者直接通过 lf.addMenuConfig 也可以调用
lf.extension.menu.addMenuConfig({
nodeMenu: [
{
text: '分享',
callback() {
alert('分享成功!')
},
},
{
text: '属性',
callback(node) {
alert(`
节点id:${node.id}
节点类型:${node.type}
节点坐标:(x: ${node.x}, y: ${node.y})
`)
},
},
],
edgeMenu: [
{
text: '属性',
callback(edge) {
const {
id,
type,
startPoint,
endPoint,
sourceNodeId,
targetNodeId,
} = edge
alert(`
边id:${id}
边类型:${type}
边起点坐标:(startPoint: [${startPoint.x}, ${startPoint.y}])
边终点坐标:(endPoint: [${endPoint.x}, ${endPoint.y}])
源节点id:${sourceNodeId}
目标节点id:${targetNodeId}
`)
},
},
],
graphMenu: [
{
text: '分享',
callback() {
alert('分享成功!')
},
},
],
})
// 如果默认菜单中存在不需要的选项,或者无法满足需求,可以通过lf.setMenuConfig重置菜单,更换为自定义菜单。
lf.extension.menu.setMenuConfig({
nodeMenu: [
{
text: "删除",
callback(node) {
lf.deleteNode(node.id);
},
},
], // 覆盖默认的节点右键菜单
edgeMenu: false, // 删除默认的边右键菜单
graphMenu: [], // 覆盖默认的边右键菜单,与false表现一样
});
// 注册自定义节点
lf.register({
type: "custom_node",
view: CustomNode,
model: CustomModel,
});
// 监听自定义事件
lf.on('custom:event', (nodeData) => {
console.log('Node deleted:', nodeData);
// 这里可以添加业务逻辑
});
lf.render({
nodes: [
{ id: 'node1', type: 'rect', x: 100, y: 100 },
{ id: 'node2', type: 'circle', x: 300, y: 100 },
{
id: 'node3',
type: 'custom_node',
x: 500,
y: 100,
properties: {
isDisabledNode: false
}
}
],
edges: [{ id: 'edge1', sourceNodeId: 'node1', targetNodeId: 'node2' }],
});
});
</script>
<style scoped>
.container {
width: 100vw;
height: 100vh;
display: flex;
flex-direction: column;
}
.flow-container {
flex: 1;
width: 100%;
height: 100%;
}
/* 自定义菜单样式 */
.lf-menu-item {
padding: 8px;
cursor: pointer;
&:hover {
background: #f0f8ff;
}
}
</style>