关于在VUE中使用echarts的拓扑图表(或关系图表type:graph)进行自定义节点数量、排序等。

需求:根据后端返回的人物特性(2条)、不足之处(1条)、自动伸出节点,并且固定住优秀、人物特性、不足之处这三个节点的xy轴坐标,并且已知人物特性最多展示5个分支、不足之处最多展示5个分支,共计13个节点。

提示:这种echarts这种拓扑图的弊端就是他的ai自动排序功能布局效果非常差,只能根据固定的数量去进行提前定位好xy轴显示在什么位置、其次另外一个缺点就是这个只适用于你知道他会展示多少条数据,如果你的数据量非常庞大,那只好去看jsplumb这种功能强大的框架。

一、代码:

1、第一步先准备好渲染echarts的容器,如果要根据我的xy轴去显示位置的话,container容器的盒子为宽700像素、高350像素,这里为了方便大家我直接写style

<div style="width: 700px; height: 350px" id="container"></div>

2、第二步先拿到后端返回的数据,根据他的数据拼成以下数组dataArray(节点)和linksArray(连线),linksArray中的source和target是节点数组中的索引值,如果你想用第一个节点连接第二个节点的话那么linksArray中的对象就要让source为0、target为1;那么假设现在你拿到的数据为以下这个样子,下列数据结合图片一展示的数据

this.dataArray = [
    {
        name: '党性修养(优)',
        category: 1,
        x: -320,
        y: -100,
        draggable: true,
        symbol:'image://' + require('../../../../static/images/humanResource/kk.png')
    },
    {
		name: '理想信念(优)',
		category: 1,
		x: -400,
		y: 50,
		symbol:'image://' + require('../../../../static/images/humanResource/kk.png')
    },
    {
		name: '党性修养(缺)',
		category: 1,
		x: 380,
		y: -70,
		symbol:'image://' + require('../../../../static/images/humanResource/kk.png')
    },
	{
	    name: '一般',
	    category: 1,
		x: -200,
		y: 40,
		symbolSize: [85, 85],
		symbol:'image://' + require('../../../../static/images/humanResource/bg-1-2.png')
	},
	{
		name: '缺点',
		category: 1,
		x: 170,
		y: 80,
		symbolSize: [85, 85],
		symbol:'image://' + require('../../../../static/images/humanResource/bg-1-3.png')
   
### 使用Vue2和ECharts实现拓扑图 要在Vue2中使用ECharts绘制拓扑图,可以按照以下方法操作。以下是完整的示例代码以及说明。 #### HTML结构 在模板部分定义一个`<div>`容器用于渲染图表: ```html <div :style="{ height: cellHeight, width: '100%' }" id="topology"></div> ``` 这里的`cellHeight`是一个动态绑定的高度属性,可以根据实际需求调整。 --- #### JavaScript逻辑 在脚本部分完成ECharts的初始化与配置: ```javascript <script> import * as echarts from "echarts"; // 局部引入ECharts export default { name: "TopologyChart", data() { return { cellHeight: "400px", // 图表高度 myChart: null, option: { title: { text: "拓扑图示例", left: "center" }, tooltip: {}, legend: [ { orient: "vertical", top: "bottom", left: "right", data: ["Node A", "Node B", "Node C"] } ], series: [ { type: "graph", layout: "none", symbolSize: 50, roam: true, label: { show: true, position: "inside" }, edgeSymbol: ["circle", "arrow"], edgeSymbolSize: [4, 10], edgeLabel: { normal: { show: true, textStyle: { fontSize: 10 } } }, data: [ { name: "Node A", x: 300, y: 300, value: "A", symbolSize: 60 }, { name: "Node B", x: 600, y: 300, value: "B", symbolSize: 60 }, { name: "Node C", x: 450, y: 600, value: "C", symbolSize: 60 } ], links: [ { source: "Node A", target: "Node B", lineStyle: { color: "#ff4d4f" } }, { source: "Node B", target: "Node C", lineStyle: { color: "#1890ff" } }, { source: "Node C", target: "Node A", lineStyle: { color: "#2fc25b" } } ] } ] } }; }, mounted() { this.initChart(); }, methods: { initChart() { const topologyDiv = document.getElementById("topology"); if (this.myChart === null || !this.myChart.getDom()) { this.myChart = echarts.init(topologyDiv); } this.myChart.setOption(this.option); // 设置图表选项 } }, beforeDestroy() { if (this.myChart) { this.myChart.dispose(); // 销毁实例以释放资源 } } }; </script> ``` --- #### CSS样式 为了确保图表显示正常,可以在样式部分设置一些基础样式: ```css <style scoped> #topology { background-color: #ffffff; } </style> ``` --- #### 关键点解析 1. **局部引入ECharts** 使用`import * as echarts from "echarts"`的方式局部引入ECharts库[^2],这种方式仅在当前组件生效,减少全局依赖带来的性能开销。 2. **拓扑图核心配置** ECharts中的`series.type='graph'`支持拓扑图绘制[^4]。通过`data`字段指定节点信息,`links`字段描述节点间的连接关系。 3. **动态布局控制** 节点位置可以通过`x`和`y`坐标手动设定,者采用自动布局算法(如力引导布局)。这里选择了固定坐标方式以便更精确地控制节点分布[^3]。 4. **生命周期管理** 在`mounted`钩子函数中初始化图表,在`beforeDestroy`钩子函数中销毁实例以防止内存泄漏[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值