--- title: Define Nodes with Vue order: 14 --- In G6, custom nodes typically require manipulating DOM or Canvas elements, but with the help of the [`g6-extension-vue`](https://github.com/Child-qjj/g6-extension-vue) ecosystem library, you can directly use Vue components as node content, enhancing development efficiency and maintainability. ## Choosing a Custom Node Solution ### G6 Node ✅ **Recommended Scenarios:** - Nodes are simple geometric shapes - Scenarios requiring efficient rendering of more than 2,000 nodes - Need to directly manipulate graphic instances for fine control > For detailed information on how to customize nodes using Canvas graphics, please refer to the [Custom Node](/en/manual/element/node/custom-node) documentation ### Vue Node ✅ **Recommended Scenarios:** - Business systems that need to integrate UI libraries like Element Plus / Ant Design Vue - Nodes contain interactive logic such as form input, state switching - Scenarios where an existing Vue design system needs to be reused ## Quick Start ### Environment Preparation Before starting, please ensure you have: - **Installed a Vue project**: Ensure a Vue project is installed and created. - **Vue version requirement**: Ensure the Vue version used is >=2.6.0. (Vue 3 is recommended) ### Install Dependencies To use [`g6-extension-vue`](https://github.com/Child-qjj/g6-extension-vue), run the following command: :::code-group ```bash [npm] npm install g6-extension-vue ``` ```bash [yarn] yarn add g6-extension-vue ``` ```bash [pnpm] pnpm add g6-extension-vue ``` ::: ### Component Integration #### 1. Register Vue Node Type Register the Vue node type through the extension mechanism: ```jsx import { ExtensionCategory, register } from '@antv/g6'; import { VueNode } from 'g6-extension-vue'; register(ExtensionCategory.NODE, 'vue-node', VueNode); ``` The `register` method requires three parameters: - Extension category: `ExtensionCategory.NODE` indicates this is a node type - Type name: `vue-node` is the name we give to this custom node, which will be used in the configuration later - Class definition: VueNode is the implementation class exported by `g6-extension-vue` #### 2. Define Business Component Define a simple Vue component as the content of the node: ```jsx import { defineComponent, h } from 'vue'; const MyVueNode = defineComponent({ setup(props, { attrs, slots, expose }) { return () => { return h('div', 'vue node'); }; }, }); ``` #### 3. Use the Component Use the custom Vue node in the graph configuration. Specify the node type and style in the graph configuration to use the custom Vue component. - `type`: Specify the node type as `vue-node` (use the name given during registration) - `style.component`: Define the Vue component content of the node ```jsx const graph = new Graph({ node: { type: 'vue-node', style: { component: () => , }, }, }); graph.render(); ``` ## Advanced Features ### State Management In complex graph visualization scenarios, nodes need to dynamically respond to interaction states. We provide two complementary state management solutions: #### Respond to Built-in Interaction States G6 provides built-in interaction state management states, such as `hover-activate` and `click-select`. You can get the current node state through the `data.states` field in the node data and adjust the node style based on the state. **Example**: Change the background color when the node is hovered. ```jsx 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 (
{label.value}
); }, }); 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) => , // data is non-reactive, need to change reference to trigger Vue's props side effects }, }, behaviors: ['hover-activate'], }); graph.render(); ``` #### Custom Business State When you need to manage business-related states (such as approval status, risk level), you can extend node data to achieve this: **Example**: Add a `selected` variable through data to achieve style changes for node selection and deselection. ```jsx 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 (
Node
); }, }); const graph = new Graph({ data: { nodes: [ { id: 'node1', style: { x: 100, y: 100 }, data: { selected: true }, }, ], }, node: { type: 'vue-node', style: { component: (data) => , // data is non-reactive, need to change reference to trigger Vue's props side effects }, }, }); graph.render(); ``` ### Event Interaction Achieve two-way communication between nodes and graph instances, allowing nodes and graph instances to update each other. **Example**: Operate graph data through custom nodes and re-render the graph. ```jsx 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