antv/x6、G6绘图 2.2.1

X6是一个强大的图编辑引擎,支持SVG和HTML定制,提供多种内置扩展,适用于流程图、DAG图等的构建。用户可以轻松初始化画布,自定义节点样式和交互,同时具备数据驱动和事件驱动的特性,便于数据逻辑和业务逻辑处理。文章涵盖了安装、使用、画布配置、节点和边的绘制以及交互设置等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网址:https://x6.antv.antgroup.com/
文档:https://x6.antv.antgroup.com/tutorial/about
API:https://x6.antv.antgroup.com/api/graph/graph
praph配置:https://x6.antv.antgroup.com/api/graph/graph#connecting

介绍:X6 是基于 HTML 和 SVG 的图编辑引擎,提供低成本的定制能力和开箱即用的内置扩展,方便我们快速搭建 DAG 图、ER 图、流程图、血缘图等应用
特性
🌱  极易定制:支持使用 SVG/HTML/React/Vue 定制节点样式和交互;
🚀  开箱即用:内置 10+ 图编辑配套扩展,如框选、对齐线、小地图等;
🧲  数据驱动:基于 MVC 架构,用户更加专注于数据逻辑和业务逻辑;
💯  事件驱动:可以监听图表内发生的任何事件。
一、安装

$ npm install @antv/x6 --save
$ yarn add @antv/x6

二、开始使用
1、初始化画布:在页面中创建一个画布容器,然后初始化画布对象,可以通过配置设置画布的样式,比如背景颜色

// 项目中 <div ref="graphStencil" class="graph-stencil" @mouseup.native.stop></div>
<div id="container"></div>
import { Graph } from "@antv/x6";
const graph = new Graph({
  container: document.getElementById("container"),
  width: 800,
  height: 600,
  background: {
    color: "#F2F7FA",
  },
});

2、绘制节点和边
3、使用插件
4、数据导出
三、基础
1、画布
(1)画布大小,可以设置width height,不设置以画布容器大小初始化画布,在项目实践中,经常会遇到下面两种场景:1)画布容器还没有渲染完成(此时尺寸为 0),就实例化画布对象,导致画布元素显示异常。2)页面的 resize 导致画布容器大小改变,导致画布元素显示异常。可以使用 autoResize 配置来解决上述问题。

<div style="width=100%; height=100%">
  <div id="container"></div>
</div>

const graph = new Graph({
  container: document.getElementById("container"),
  autoResize: true,  // 自动调整画布大小
  grid: true, // 使用网格
  mousewheel: {
			enabled: true,  // 是否开启滚轮缩放交互
			zoomAtMousePosition: true,  // 是否将鼠标位置作为中心缩放
			modifiers: 'ctrl', // 修饰键('alt'、'ctrl'、'meta'、'shift'),设置修饰键后需要按下修饰键并滚动鼠标滚轮时才触发画布缩放。通过设置修饰键可以解决默认滚动行为与画布缩放冲突问题
			minScale: 0.5,
			maxScale: 3,
		},
});

(2)画布背景及网格:通过 background 和 grid 两个配置来设置画布的背景以及网格
(3)缩放和平移:panning 和 mousewheel 配置来实现这两个功能,鼠标按下画布后移动时会拖拽画布,滚动鼠标滚轮会缩放画布
2、节点
节点渲染方式:
(1)如果节点内容比较简单,而且需求比较固定,使用 SVG 节点
(2)其他场景,都推荐使用当前项目所使用的框架来渲染节点

添加节点
内置节点
定制节点:通过 markup 和 attrs 来定制节点的形状和样式,markup 可以类比 HTML,attrs 类比 CSS

// 表示包含rect image text 三个 SVG 元素,渲染到页面之后,节点对应的 SVG 元素类似3个标签
markup: [
		{
			tagName: 'rect', // SVG/HTML 元素标签名
			selector: 'body', // 该元素的选择器(唯一),通过选择器来定位该元素或为该元素指定属性样式
		},
		{
			tagName: 'image',
			selector: 'image',
		},
		{
			tagName: 'text',
			selector: 'label',
		},
	],

attrs: {
		body: {
			strokeWidth: 1,
			stroke: '#bababa',
			fill: '#EFF4FF',
		},
		image: {
			width: 18,
			height: 18,
			refX: 6,
			refY: 6,
			color: '#fff',
		},
		label: {
			refX: '50%',
			refY: '50%',
			textAnchor: 'middle',
			textVerticalAnchor: 'middle',
			fontSize: 12,
			fill: '#262626',
		},
	},
	ports: {
		groups: {
			top: {
				position: 'top',
				attrs: {
					circle: {
						r: 4,
						magnet: true,
						stroke: '#5F95FF',
						strokeWidth: 1,
						fill: '#fff',
						style: {
							visibility: 'hidden',
						},
					},
				},
			},
			right: {
				position: 'right',
				attrs: {
					circle: {
						r: 4,
						magnet: true,
						stroke: '#5F95FF',
						strokeWidth: 1,
						fill: '#fff',
						style: {
							visibility: 'hidden',
						},
					},
				},
			},
			bottom: {
				position: 'bottom',
				attrs: {
					circle: {
						r: 4,
						magnet: true,
						stroke: '#5F95FF',
						strokeWidth: 1,
						fill: '#fff',
						style: {
							visibility: 'hidden',
						},
					},
				},
			},
			left: {
				position: 'left',
				attrs: {
					circle: {
						r: 4,
						magnet: true,
						stroke: '#5F95FF',
						strokeWidth: 1,
						fill: '#fff',
						style: {
							visibility: 'hidden',
						},
					},
				},
			},
		},
		items: [
			{
				group: 'top',
			},
			{
				group: 'right',
			},
			{
				group: 'bottom',
			},
			{
				group: 'left',
			},
		],
	},

3、边:router、connector
4、连接:配置 items,items 是一个数组 PortMetadata[],数组的每一项表示一个连接桩(就是可以连接线的圆点) 以上port的配置

5、交互:在画布实例中配置:connecting,在边教程中我们知道,可以在添加边的时候指定 router 和 connector,如果整个画布中大部分边的 router 或者 connector 是一样的,我们可以直接配置在 connecting 中,这样就可以避免在边中重复配置。

connecting: {
			router: {
				name: 'metro',
			},
			connector: {
				name: 'rounded',
				args: {
					radius: 8,
				},
			},
			anchor: 'center',
			connectionPoint: 'anchor',
			allowBlank: false,
			snap: {
				radius: 20,
			},
			createEdge() { // 配置拉出线的样式
				return new Shape.Edge({
					attrs: {
						line: {
							stroke: '#A2B1C3',
							strokeWidth: 2,
							targetMarker: {
								name: 'block',
								width: 12,
								height: 8,
							},
						},
					},
					zIndex: 0,
				});
			},
			validateConnection({ targetMagnet }) {
				return !!targetMagnet;
			},
		},

highlighting: { // 触发某种事件时的高亮样式
			magnetAdsorbed: { //接桩吸附连线时在连接桩外围围渲染一个包围框
				name: 'stroke',
				args: {
					attrs: {
						fill: '#5F95FF',
						stroke: '#5F95FF',
					},
				},
			},
		},

6、
7、
四、

<think>好的,用户想要在Vue2中使用AntV X61.34.5版本实现泳道图。我需要先回忆一下AntV X6的基本概念和泳道图的构成。泳道图通常用于工作流或流程图中,按职责或部门划分不同的区域,每个区域称为一个泳道。 首先,用户使用的是Vue2,可能需要考虑如何在Vue组件中集成X6AntV X6是基于HTML的图形库,所以需要创建容器元素,然后在Vue的mounted生命周期中初始化画布。 接下来,版本1.34.5的X6,可能需要查阅对应版本的文档,确认一些API是否可用。比如,泳道图通常用矩形嵌套,每个泳道内部包含节点和连线。可能需要使用Group组件或者手动管理层次结构。 然后,需要创建泳道的结构。每个泳道可能是一个带有标题的矩形,里面可以放置其他节点。可能需要使用X6的Rectangle节点,并设置attrs来定义样式,比如不同的背景颜色和边框。标题可能通过文本标签实现。 另外,泳道内的节点需要限制在泳道范围内,可能需要通过坐标计算或使用Port来管理连接点。连线方面,可能需要使用Edge组件,并确保连接正确,比如使用锚点和连接点配置。 数据驱动方面,Vue组件可能需要接收泳道和节点的数据,动态渲染到画布上。需要处理节点的拖拽、连线的事件,以及更新数据后的重新渲染问题。可能需要用到X6的事件监听,比如node:added、edge:connected等。 还需要考虑交互功能,比如调整泳道大小、拖拽泳道时内部节点的联动。X6是否有相关的插件或内置功能支持?比如Scroller插件用于大画布,或者Transform插件调整元素大小。 样式方面,可能需要自定义节点和边的样式,确保泳道之间有明显的视觉区分。使用attrs来设置填充颜色、边框样式,以及标题栏的样式。 最后,测试和调试。确保在Vue2的环境中,X6的初始化、更新和销毁过程没有内存泄漏或事件重复绑定的问题。在组件销毁时,需要调用graph.dispose()来释放资源。 总结步骤大概是:安装依赖、创建容器、初始化画布、定义泳道节点、添加交互功能、处理数据动态更新。可能需要参考X6的官方文档和示例,特别是Group和嵌套节点的部分,确保泳道的结构正确。</think>在Vue2中使用AntV X6 1.34.5版本实现泳道图,可按照以下步骤进行: --- ### 一、环境准备 ```bash npm install @antv/x6@1.34.5 npm install @antv/x6-vue-shape@1.3.0 # Vue节点渲染适配 ``` --- ### 二、基础画布初始化 ```vue <template> <div ref="container" style="height: 600px"></div> </template> <script> import { Graph } from '@antv/x6' export default { mounted() { this.initGraph() }, methods: { initGraph() { this.graph = new Graph({ container: this.$refs.container, grid: true, panning: true, mousewheel: true }) } } } </script> ``` --- ### 三、泳道图实现核心步骤 #### 1. 创建泳道容器 ```javascript createLane(title, x, y, width, height) { return this.graph.addNode({ shape: 'rect', x, y, width, height, attrs: { body: { fill: '#F5F7FA', stroke: '#D4D8DD', strokeWidth: 2 }, label: { text: title, fontSize: 16, fill: '#333', refX: 10, refY: 10 } }, // 禁止拖拽泳道本身 draggable: false }) } ``` #### 2. 添加泳道内容节点 ```javascript addNodeInLane(lane, nodeConfig) { const position = lane.getPosition() const padding = 20 this.graph.addNode({ ...nodeConfig, x: position.x + padding, y: position.y + 50, // 避开标题区域 width: lane.getSize().width - 2*padding }) } ``` #### 3. 连线逻辑 ```javascript connectNodes(sourceId, targetId) { this.graph.addEdge({ source: { cell: sourceId }, target: { cell: targetId }, router: 'orth', connector: 'rounded', attrs: { line: { stroke: '#A2B1C6', strokeWidth: 2 } } }) } ``` --- ### 四、完整示例调用 ```javascript // 创建泳道 const salesLane = this.createLane('销售流程', 50, 50, 800, 300) const financeLane = this.createLane('财务审批', 50, 400, 800, 250) // 添加节点 const node1 = this.addNodeInLane(salesLane, { shape: 'rect', label: '客户咨询', attrs: { body: { fill: '#E6F7FF' } } }) const node2 = this.addNodeInLane(financeLane, { shape: 'circle', label: '财务审核', width: 80, height: 80 }) // 创建连线 this.connectNodes(node1.id, node2.id) ``` --- ### 五、高级功能建议 1. **动态适配** ```javascript // 监听窗口变化 window.addEventListener('resize', () => { this.graph.centerContent() }) ``` 2. **泳道折叠** ```javascript toggleLane(laneId) { const lane = this.graph.getCellById(laneId) const collapsed = lane.hasClass('collapsed') lane.toggleClass('collapsed', !collapsed) lane.attr('body/display', collapsed ? 'visible' : 'none') } ``` 3. **数据持久化** ```javascript saveGraphData() { return this.graph.toJSON() } ``` --- ### 六、注意事项 1. **版本兼容性**:确保所有依赖包版本匹配 2. **性能优化**:超过50个节点时建议启用虚拟渲染 ```javascript new Graph({ // ... async: true, virtual: true }) ``` 3. **事件监听**:及时清理事件避免内存泄漏 ```javascript beforeDestroy() { this.graph.dispose() } ``` 实际开发中需根据业务需求调整样式、交互逻辑和数据绑定方式。建议参考[AntV X6官方文档](https://x6.antv.vision/zh)获取最新API细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值