使用 Vue 定义节点
上一篇
使用 React 定义节点
下一篇
边总览
Loading...
在 G6 中,自定义节点通常需要操作 DOM 或 Canvas 元素,但借助 g6-extension-vue
社区生态库,可以直接使用 Vue 组件作为节点内容,提升开发效率与可维护性。
✅ 推荐场景:
有关如何使用 Canvas 图形自定义节点的详细信息,请参阅 自定义节点 文档
✅ 推荐场景:
在开始之前,请确保您已经:
要使用 g6-extension-vue
,请运行以下命令:
npm install g6-extension-vue
通过扩展机制注册 Vue 节点类型:
import { ExtensionCategory, register } from '@antv/g6';import { VueNode } from 'g6-extension-vue';register(ExtensionCategory.NODE, 'vue-node', VueNode);
register
方法需要三个参数:
ExtensionCategory.NODE
表示这是一个节点类型vue-node
是我们给这个自定义节点起的名字,后续会在配置中使用g6-extension-vue
导出的实现类定义一个简单的 Vue 组件作为节点的内容:
import { defineComponent, h } from 'vue';const MyVueNode = defineComponent({setup(props, { attrs, slots, expose }) {return () => {return h('div', 'vue node');};},});
在图配置中使用自定义的 Vue 节点。通过在图配置中指定节点类型和样式,来使用自定义的 Vue 组件。
type
:指定节点类型为 vue-node
(使用与注册时起的名字)style.component
:定义节点的 Vue 组件内容const graph = new Graph({node: {type: 'vue-node',style: {component: () => <MyVueNode />,},},});graph.render();
在复杂图可视化场景中,节点需要动态响应交互状态。我们提供两种互补的状态管理方案:
G6 提供内置的交互状态管理状态,如 hover-activate
和 click-select
。可以通过节点数据中的 data.states
字段获取当前节点状态,并根据状态调整节点样式。
示例:在节点被 hover 时改变背景颜色。
import { ExtensionCategory, register, Graph } from '@antv/g6';import { VueNode } from 'g6-extension-vue';import { computed, defineComponent } from 'vue';register(ExtensionCategory.NODE, 'vue-node', VueNode);const StatefulNode = defineComponent({setup(props, { attrs, slots, expose }) {const isActive = computed(() => props.data.states?.includes('active'));const label = computed(() => props.data.data?.label);return (<divstyle={{width: 100,padding: 5,border: '1px solid #eee',boxShadow: isActive.value ? '0 0 8px rgba(24,144,255,0.8)' : 'none',transform: `scale(${isActive.value ? 1.05 : 1})`,}}>{label.value}</div>);},});const graph = new Graph({data: {nodes: [{ id: 'node1', style: { x: 100, y: 200 }, data: { label: 'node1' } },{ id: 'node2', style: { x: 300, y: 200 }, data: { label: 'node2' } },],},node: {type: 'vue-node',style: {component: (data) => <StatefulNode data={Object.assign({}, data)} />, // data是非响应式数据,需要通过改变引用来触发Vue的props副作用},},behaviors: ['hover-activate'],});graph.render();
当需要管理业务相关状态(如审批状态、风险等级)时,可通过扩展节点数据实现:
示例:通过 data 添加 selected
变量,实现节点选中和取消选中的样式变化。
import { ExtensionCategory, register, Graph } from '@antv/g6';import { VueNode } from 'g6-extension-vue';import { defineComponent, computed } from 'vue';register(ExtensionCategory.NODE, 'vue-node', VueNode);const MyVueNode = defineComponent({setup(props, { attrs, slots, expose }) {const isSelected = computed(() => props.data.data.selected);const handleClick = () => {graph.updateNodeData([{ id: props.data.id, data: { selected: !isSelected.value } }]);graph.draw();};return (<divstyle={{width: 200,padding: 10,border: '1px solid red',borderColor: isSelected.value ? 'orange' : '#ddd', // 根据选中状态设置边框颜色cursor: 'pointer', // 添加鼠标指针样式}}onClick={handleClick}>Node</div>);},});const graph = new Graph({data: {nodes: [{id: 'node1',style: { x: 100, y: 100 },data: { selected: true },},],},node: {type: 'vue-node',style: {component: (data) => <MyVueNode data={Object.assign({}, data)} graph={graph} />, // data是非响应式数据,需要通过改变引用来触发Vue的props副作用},},});graph.render();
实现节点与图实例的双向通信,使节点和图实例可以相互更新。
示例:通过自定义节点操作图数据,并重新渲染图形。
import { ExtensionCategory, register, Graph } from '@antv/g6';import { VueNode } from 'g6-extension-vue';import { defineComponent, computed } from 'vue';register(ExtensionCategory.NODE, 'vue-node', VueNode);const IDCardNode = defineComponent({setup(props, { attrs, slots, expose }) {const isSelected = computed(() => props.data.data.selected);const handleSelect = () => {graph.updateNodeData([{ id: props.data.id, data: { selected: true } }]);graph.draw();};return <Select onChange={handleSelect} style={{ background: isSelected.value ? 'orange' : '#eee' }} />;},});const graph = new Graph({node: {type: 'vue-node',style: {component: ({ id, data }) => <IDCardNode id={id} selected={isSelected.value} graph={graph} />,},},});