vue2使用 vis-network 和 vue-vis-network 插件封装一个公用的关联关系图

效果图:

vis组件库:vis.js

vis-network中文文档:vis-network

安装组件库:

npm install vis-network vue-vis-network
或
yarn add vis-network vue-vis-network

新建RelationGraph.vue文件:

<template>
	<div>
		<div ref="networkContainer" style="height: 400px; background-color: #e7e7e7;width: 500px;"></div>
	</div>
</template>

<script>
	import {
		Network
	} from 'vis-network/standalone/esm/vis-network.js';
	import VueVisNetwork from 'vue-vis-network';

	export default {
		name:"RelationGraph",
		props: {
			nodes: {
				type: Array,
				required: true,
			},
			edges: {
				type: Array,
				required: true,
			},
			options: {
				type: Object,
				default: () => ({}),
			},
		},
		components: {
			VueVisNetwork,
		},
		mounted() {
			// 创建关联关系图
			const container = this.$refs.networkContainer;
			const data = {
				nodes: this.nodes,
				edges: this.edges,
			};
			new Network(container, data, this.options);
		},
	};
</script>

页面使用:

<div>
	<relation-graph :nodes="nodes" :edges="edges" :options="graphOptions"></relation-graph>
</div>
import RelationGraph from './RelationGraph.vue';
export default {
        components: {
			RelationGraph,
		},
		data() {
			return {
				nodes: [{
						id: 0,
						label: "大前端",
						color: {
							background: "#fd91b7"
						},
					},
					{
						id: 1,
						label: "HTML",
						color: {
							background: "#7ed6df"
						},
					},
					{
						id: 2,
						label: "JavaScript",
						color: {
							background: "#d294e2"
						},
					},
					{
						id: 3,
						label: "CSS",
						color: {
							background: "#ffb300"
						},
					}
				],
				edges: [{
						id: "e1",
						from: 0,
						to: 1,
						label: "含"
					},
					{
						id: "e2",
						from: 1,
						to: 0,
						label: "嵌"
					},
					{
						id: "e3",
						from: 0,
						to: 2,
						label: "step1"
					},
					{
						id: "e4",
						from: 0,
						to: 3,
						label: "step1"
					},
				],
				graphOptions: {
					autoResize: true, //网络将自动检测其容器的大小调整,并相应地重绘自身
					locale: "cn", //语言设置:工具栏显示中文
					//设置语言
					locales: {
						cn: {
							//工具栏中文翻译
							edit: "编辑",
							del: "删除当前节点或关系",
							back: "返回",
							addNode: "添加节点",
							addEdge: "添加连线",
							editNode: "编辑节点",
							editEdge: "编辑连线",
							addDescription: "点击空白处可添加节点",
							edgeDescription: "点击某个节点拖拽连线可连接另一个节点",
							editEdgeDescription: "可拖拽连线改变关系",
							createEdgeError: "无法将边连接到集群",
							deleteClusterError: "无法删除集群.",
							editClusterError: "无法编辑群集'",
						},
					},
					// 设置节点样式
					nodes: {
						shape: "dot", //节点的外观。为circle时label显示在节点内,为dot时label显示在节点下方
						size: 30, //节点的大小,
						shadow: false, //如果为true,则节点使用默认设置投射阴影。
						font: {
							//字体配置
							size: 18,
							color: "rgb(117, 218, 167)",
							align: "center",
						},
						color: {
							border: "transparent", //节点边框颜色
							background: "#ffc7c7", //节点背景颜色
							highlight: {
								//节点选中时状态颜色
								border: "rgb(255, 0, 0)",
								background: "rgb(255, 0, 0)",
							},
							hover: {
								//节点鼠标滑过时状态颜色
								border: "#dff9fb",
								background: "#88dab1",
							},
						},
						margin: 5, //当形状设置为box、circle、database、icon、text;label的边距
						widthConstraint: 100, //设置数字,将节点的最小和最大宽度设为该值,当值设为很小的时候,label会换行,节点会保持一个最小值,里边的内容会换行
						borderWidth: 1, //节点边框宽度,单位为px
						borderWidthSelected: 3, //节点被选中时边框的宽度,单位为px
						labelHighlightBold: false, //确定选择节点时标签是否变为粗体
					},
					// 边线配置
					edges: {
						width: 1,
						length: 200,
						color: {
							color: "#848499",
							highlight: "rgb(255, 85, 0)",
							hover: "#88dab1",
							inherit: "from",
							opacity: 1.0,
						},
						font: {
							color: "#343434",
							size: 18, // px
							face: "arial",
							background: "none",
							strokeWidth: 2, // px
							strokeColor: "#ffffff",
							align: "horizontal",
							multi: false,
							vadjust: 0,
							bold: {
								color: "#343434",
								size: 14, // px
								face: "arial",
								vadjust: 0,
								mod: "bold",
							},
							ital: {
								color: "#343434",
								size: 14, // px
								face: "arial",
								vadjust: 0,
								mod: "italic",
							},
							boldital: {
								color: "#343434",
								size: 14, // px
								face: "arial",
								vadjust: 0,
								mod: "bold italic",
							},
							mono: {
								color: "#343434",
								size: 15, // px
								face: "courier new",
								vadjust: 2,
								mod: "",
							},
						},
						shadow: false,
						smooth: {
							//设置两个节点之前的连线的状态
							enabled: true, //默认是true,设置为false之后,两个节点之前的连线始终为直线,不会出现贝塞尔曲线
						},
						arrows: {
							to: true, //默认是false
						}, //箭头指向to
					},
					// 布局
					layout: {
						randomSeed: 2, //配置每次生成的节点位置都一样,参数为数字1、2等
					},
					//计算节点之前斥力,进行自动排列的属性
					physics: {
						enabled: true, //默认是true,设置为false后,节点将不会自动改变,拖动谁谁动。不影响其他的节点
						barnesHut: {
							gravitationalConstant: -4000,
							centralGravity: 0.3,
							springLength: 120,
							springConstant: 0.04,
							damping: 0.09,
							avoidOverlap: 0,
						},
					},
				},
			}
		},
	}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 vis-network 实现动态添加编辑节点和拖拽添加线的步骤如下: 1. 安装 vis-network:在命令行中使用 npm 或 yarn 安装 vis-network。 2. 创建一个空的 vis-network 表:在 HTML 中创建一个空的 div 元素,然后在 JavaScript使用 vis.Network() 函数创建一个 vis-network 表,并将其绑定到该 div 元素上。 3. 添加节点:使用 addNode() 方法添加节点。可以设置节点的 ID、标签、颜色、形状等属性。 4. 编辑节点:在节点上双击即可编辑节点内容。 5. 拖拽添加线:使用 dragStart 和 dragEnd 事件来监听拖拽操作,并使用 addEdge() 方法添加线。可以设置线的起点、终点、标签、颜色等属性。 下面是一个示例代码: ```html <!DOCTYPE html> <html> <head> <title>vis-network</title> <script type="text/javascript" src="https://unpkg.com/vis-network/standalone/umd/vis-network.min.js"></script> </head> <body> <div id="network" style="height: 500px;"></div> <script type="text/javascript"> // 创建一个空的 vis-network 表 var container = document.getElementById('network'); var options = {}; var data = { nodes: [], edges: [] }; var network = new vis.Network(container, data, options); // 添加节点 var newNode = {id: 'node1', label: 'Node 1', color: '#ff0000', shape: 'circle'}; network.addNode(newNode); // 编辑节点 network.on('doubleClick', function (params) { if (params.nodes.length > 0) { var nodeId = params.nodes[0]; network.editNode(nodeId); } }); // 拖拽添加线 var edgeStartNode = null; network.on('dragStart', function (params) { if (params.nodes.length > 0) { edgeStartNode = params.nodes[0]; } }); network.on('dragEnd', function (params) { if (params.nodes.length > 0 && edgeStartNode !== null) { var edgeEndNode = params.nodes[0]; var newEdge = {from: edgeStartNode, to: edgeEndNode, label: 'New Edge', color: '#0000ff'}; network.addEdge(newEdge); edgeStartNode = null; } }); </script> </body> </html> ``` 在上面的示例代码中,我们首先创建了一个空的 vis-network 表,并将其绑定到一个 div 元素上。然后,我们添加了一个节点,当双击节点时可以编辑节点内容。最后,我们使用 dragStart 和 dragEnd 事件监听拖拽操作,并使用 addEdge() 方法添加线。运行该示例代码,可以看到一个空的 vis-network 表和一个带有一个节点的表。当双击节点时,可以编辑节点内容;当拖拽一个节点到另一个节点上时,可以添加一条连接两个节点的线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值