Node
和 边 Edge
<div id="container"></div>
import { Graph } from "@antv/x6";
const graph = new Graph({
container: document.getElementById("container"),
width: 800,
height: 600,
background: {
color: "#F2F7FA",
},
});
画布对象是整个结果,包含都有的东西的引用,可用来设置宽度,背景色,栅格样式,开启是否移动缩放,监听事件(节点的增加和删除等),操作节点和边等,
比如我的画布配置是
const graphConfig = {
connecting: {
router: {
name: 'normal',//’manhattan‘:智能正交路径
args: {
// offset: 25,
// direction: 'H',
},
},
allowMulti: false, // 是否允许在相同的起始节点和终止之间创建多条边,默认为 true。
allowBlank: false,
sourceAnchor: {
name: "right", // 锚点会在节点右侧中心往上偏移 10px
args: {
dy: 0,
},
},
targetAnchor: {
name: "left", // 锚点会在节点右侧中心往上偏移 10px
args: {
dy: 0,
},
},
connectionPoint: "anchor",
},
// 鼠标拖动画布
panning: true,
// 鼠标缩放画布
mousewheel: true,
background: {
color: '#F2F7FA',
},
grid: {
visible: true,
type: 'doubleMesh',
args: [
{
color: '#eee', // 主网格线颜色
thickness: 1, // 主网格线宽度
},
{
color: '#ddd', // 次网格线颜色
thickness: 1, // 次网格线宽度
factor: 4, // 主次网格线间隔
},
],
},
}
以下为常用的方法
/**
* 使用插件
*/
graph.use(某插件)
/**
* 通过id找cell
*/
graph.getCellById("1234")
/**
** 复制一个节点,并带位移粘贴,如果一个节点有很多子节点,使用内置方法是最好的,避免大量运算
*/
graph.copy([node], {deep: true})
graph.paste({offset: {dx: 22, dy: 22}})
/**
** 获取当前画布左上角的坐标,使用场景是新建一个节点,在最上角,否则不好找
*/
graph.graphToLocal()
/**
** 从json数据生产整个画布
*/
graph.fromJSON(json)
/**
** 画布导出json数据
*/
graph.toJSON()
/**
** 节点操作
*/
// 得到所有的节点
g.getNodes();
// 新建节点,并放到画布上
graph.addNode()
// 新建节点,不放到画布上,使用场景比如,节点被拖入画布
graph.createNode()
// 新建边,并放到画布上
graph.addEdge()
// 新建边,不放到画布上
graph.createEdge()
/**
** 常用事件
*/
// 监听节点的连接事件,得到边
graph.on('edge:connected', ({ isNew, edge }) => {})
// 节点的双击事件
graph.on('node:dblclick', ({ node }) => {})
// 节点的单击事件
graph.on('node:click', ({ node }) => {})
// 监听节点里,子节点的变化
graph.on('cell:change:children', (args) => {})
// 监听节点嵌入,就是被拖入父节点的事件
graph.on('node:embedded', (args) => {})
就是节点和边的父类,有一些公用的方法
// 删除
cell.remove()
// 设置尺寸
cell.setSize()
// 设置位置
cell.setPosition()
cell.clone()
// 位置尺寸
cell.getBBox()
// 上级
cell.parent
// 下级
cell.children
// 显示和隐藏
cell.show()
cell.hide()
就是父节点里有子节点, 子节点会和父节点一起被拖动
let g = new Graph({
container: this.ref.current,
...graphConfig,
// 通过 embedding对象来控制群组,实现能不能拖拽进入父节点的功能
embedding: {
enabled: true,
findParent({ node }) {
const bbox = node.getBBox();
return this.getNodes().filter((n) => {
if (node.shape === 'custom-react-node') {
return false;
}
const data = n.getData();
if (data && data.parent) {
const targetBBox = n.getBBox();
return bbox.isIntersectWithRect(targetBBox);
}
return false;
});
},
},
});
// 给节点,添加子节点
node.addChildren()
节点自身的引用,画布的引用都可以取到,data就类似副作用,使用它来更新节点
import { register } from '@antv/x6-react-shape';
register({
shape: "custom-react-node",
width: 100,
height: 100,
effect: ["data"],
component: NodeComponent,
});
const node = graph.addNode({
shape: "custom-react-node",
x: 60,
y: 100,
data: {
progress: 30,
},
});
setInterval(() => {
const { progress } = node.getData<{ progress: number }>();
node.setData({
progress: (progress + 10) % 100,
});
}, 1000);
更多内容可以看官网文档
对齐线
import { Snapline } from "@antv/x6-plugin-snapline";
const graph = new Graph({
background: {
color: "#F2F7FA",
},
});
graph.use(
new Snapline({
enabled: true,
})
);
复制粘贴
import { Clipboard } from "@antv/x6-plugin-clipboard";
const graph = new Graph({
background: {
color: "#F2F7FA",
},
});
graph.use(
new Clipboard({
enabled: true,
})
);
快捷键
import { Clipboard } from "@antv/x6-plugin-clipboard";
const graph = new Graph({
background: {
color: "#F2F7FA",
},
});
graph.use(
new Clipboard({
enabled: true,
})
);
拖拽
import { Dnd } from "@antv/x6-plugin-dnd";
const graph = new Graph({
background: {
color: "#F2F7FA",
},
});
const dnd = new Dnd({
target: graph,
});
export default () => {
const startDrag = (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {
// 该 node 为拖拽的节点,默认也是放置到画布上的节点,可以自定义任何属性
const node = graph.createNode({
shape: "rect",
width: 100,
height: 40,
});
dnd.start(node, e.nativeEvent);
};
return (
<ul>
<li onMouseDown={startDrag}></li>
</ul>
);
};