# topology-vue3 **Repository Path**: JerryCodeCloud/topology-vue3 ## Basic Information - **Project Name**: topology-vue3 - **Description**: flow-topology-ve3 是一个用于创建流拓扑图的 Vue 3 组件库, 导出 Topology、TemplateWrapper、AnchorWrapper 组件。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-06 - **Last Updated**: 2025-09-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## flow-topology-vue3 是一个用于创建流拓扑图的 Vue 3 组件库, 导出 Topology、TemplateWrapper、AnchorWrapper 组件。 ### 示例图: ![示例](https://i-blog.csdnimg.cn/direct/b2b0b44ed2c74f74a19690eb921a50b9.jpeg) ### 留言板: [留言板](https://blog.csdn.net/qq_40040585/article/details/148478175?sharetype=blogdetail&sharerId=148478175&sharerefer=PC&sharesource=qq_40040585&spm=1011.2480.3001.8118) ### 特性 - 纯 div + svg 实现,无依赖。 - 支持拖拽节点、连线。 - 支持自定义节点样式和锚点(分支)样式。 - 模板化节点开发(通过 TemplateWrapper)。 - 支持全选、放大、缩小、截图。 - 支持锚点(分支)连接多个节点。 ### 环境 - Vue3 - Node.js 18.x+(兼容更高版本) ## 安装 ```bash npm install flow-topology-vue3 ``` ## 使用 - 全局引入 ```js import { createApp } from 'vue' import App from './App.vue' import FlowTopologyVue3 from 'flow-topology-vue3' import 'flow-topology-vue3/dist/flow-topology-vue3.css' const app = createApp(App) app.use(FlowTopologyVue3) app.mount('#app') ``` - 按需引入 ```js ``` - 自动引入 ```js npm install unplugin-vue-components -D ``` ```js // vite.config.js import { defineConfig } from 'vite' import Components from 'unplugin-vue-components/vite' import { FlowTopologyVue3Resolver } from 'flow-topology-vue3/dist/flow-topology-vue3.es.js' export default defineConfig({ plugins: [ Components({ resolvers: [FlowTopologyVue3Resolver()] }) ] }) ``` ### 数据据类型
类型名称 说明
Ftv3BranchVO { id: string | number, label: string, to?: (string | number)[], } 分支数据类型,用于定义节点的分支信息。
Ftv3LineVO { id: string | number label: string to?: Array } 连线数据类型,用于定义节点之间的连接线信息。
Ftv3NodeVO { id: string | number, position: { x: number, y: number, }, canDrag?: boolean, title?: string, content?: string, width?: number, branches: Ftv3LineVO[], [prop: string]: any, } 节点数据类型,用于定义节点的位置、大小、分支等信息。
``` import { Ftv3NodeVO, Ftv3BranchVO, Ftv3LineVO } from 'flow-topology-vue3' ``` ### 组件 #### Topology 主流程图组件 - 属性
参数 类型 是否必需 默认值 说明
v-model/model-value Array as PropType<{ id: string | number, position: { x: number, y: number, }, canDrag?: boolean, title?: string, content?: string, width?: number, branches: { id: string | number, label: string, to?: (string | number)[], }[], [prop: string]: any, }[]> [] 所有节点和连线数据
containerWidth [Number, String] 100% 画布外容器宽度 支持数字 px % 等
containerHeight [Number, String] 100vh 画布外容器高度 支持数字 px % 等
containerBackgroundColor String #f9f9f9 画布外容器背景
canvasWidth Number 100vh 画布宽度 仅支持数字
canvasHeight Number 100vh 画布高度 仅支持数字
showGridPattern Boolean true 是否显示网格
gridPatternColor String #e5e5e5 网格线颜色
gridPatternGap Number 20 网格大小
showToolsBar Boolean true 是否显示工具栏
toolsBarList Array as PropType<{ ViewCenter = 'viewCenter', ToggleSelect = 'toggleSelect', Zoom = 'zoom', Capture = 'capture' }[]> ['viewCenter', 'toggleSelect', 'zoom', 'capture'] 工具栏种类(定位中心、全选/反选、缩放、截图)
toolsBarPosition String as PropType<{ Top = 'top', TopStart = 'top-start', TopEnd = 'top-end', Bottom = 'bottom', BottomStart = 'bottom-start', BottomEnd = 'bottom-end', Left = 'left', Right = 'right' }> bottom-end 工具栏位置
toolsBarPositionOffset Number 20 工具栏距离容器边距位置
readOnly Boolean false 是否只读
beforeDeleteLine Function as PropType<(line: { fromNodeId: string | number fromBranchId: string | number toNodeId: string | number }) => boolean | Promise> () => true 删除连线前的钩子,参数是删除的线 若返回false时或者Promise.reject()阻止删除
beforeDeleteNode Function as PropType<(node: { id: string | number, position: { x: number, y: number, }, canDrag?: boolean, title?: string, content?: string, width?: number, branches: { id: string | number, label: string, to?: string | number, }[], [prop: string]: any, }) => boolean | Promise> () => true 删除节点前的钩子,参数是删除的节点,若返回false时或者Promise.reject()阻止删除
beforeDeleteAllNode Function as PropType<() => boolean | Promise> () => true 删除所有节点前的钩子,若返回false时或者Promise.reject()阻止删除
renderItem Function as PropType<(nodeVO: NodeVO) => any> null 自定义函数渲染节点内容,参数是节点数据对象,返回自定义渲染内容
captureBackgroundColor String 容器背景色 截图背景色, 若不设置则使用容器背景色
canConnectMultiLines Boolean false 是否允许多条连线, 若为true则连线时一个锚点(分支)支持多个连线, 若为false则连线时一个锚点(分支)只支持一条连线
- 事件
事件名 参数 说明
change { type: 'add_node' | 'delete_node' | 'update_node_position' | 'add_line' | 'delete_line' | 'delete_node_line' , data: any} 节点和线改变,参数为响应操作的数据,tips:删除接点和连接线请使用键盘delete键
selectNode NodeVO 选中节点,参数为选中的节点数据
capture string 截图, 参数为base64
- 插槽 默认插槽用于自定义渲染节点内容,可通过插槽参数获取到当前节点的数据; - 使用方法 ```html ``` #### TemplateWrapper TemplateWrapper 组件用于包裹模板内容,并提供插槽供自定义渲染。 - 属性 - 插槽 默认插槽用于自定义渲染模板内容。
参数 类型 是否必需 默认值 说明
generator { id: string | number, position: { x: number, y: number, }, canDrag?: boolean, title?: string, content?: string, width?: number, branches: { id: string | number, label: string, to?: string | number, }[], [prop: string]: any, } - 节点的数据
disabled Boolean false 是否允许拖拽
- 使用方法 - 模版中使用 ```html
{{ item.title }}
``` - h 函数渲染 ```js h( 'div', {...你的属性...}, templateNode.branches.map(t => { return h( TemplateWrapper, { generator: t, disabled: t.disabled, }, [ h('div', { class: 'quick-element' }, t.title) ] ) }) ) ``` #### AnchorWrapper AnchorWrapper 组件用于包裹锚点内容,并提供插槽供自定义渲染。 - 属性
参数 类型 是否必需 默认值 说明
node { id: string | number, position: { x: number, y: number, }, canDrag?: boolean, title?: string, content?: string, width?: number, branches: { id: string | number, label: string, to?: string | number, }[], [prop: string]: any, } - 节点的数据
branch { id: string | number label: string to?: string | number } 当前节点分支
- 插槽 默认插槽用于自定义渲染锚点内容。 - 使用方法 - 模版中使用 ```html {{ branch.label }} ``` - h 函数渲染 ```js h( 'div', {...你的属性...}, node.branches.map(branch => { return h( AnchorWrapper, { class: `topo-branch ${!branch.to ? 'free' : ''}`, node: toRaw(node), branch: toRaw(branch) }, () => branch.label ) }) ) ``` ### 组件实例的方法
方法名 参数 说明
selectNode id:string | number 选中节点
deleteNode id:string | number 删除单个节点
deleteAllNode - 删除所有节点
使用示例 ```js const handleDel = () => { topologyRef.value.deleteNode('48da386a-016a-4e49-a26f-f0dfec0d3880') } const handleDelAll = () => { topologyRef.value.deleteAllNode() } const handleSelect = () => { topologyRef.value.selectNode('500e4096-78a8-465b-b0f3-e748cf5716b3') } ``` ### DEMO ```js ```