在vue中使用eacharts创建graph关系图方式
作者:前端小钢炮
这篇文章主要介绍了在vue中使用eacharts创建graph关系图方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
使用eacharts创建graph关系图
在最近的工作中遇到了这个问题一开始遇到遇到问题且网上现在的教程不那么详细于是想着自己写一个来记录一下。
首先想使用echarts先下载echarts包命令如下
npm install echarts --save
然后将eacharts引入到项目中,推荐在main.js引入。
import * as echarts from 'echarts';
引入完毕后将echarts挂载在原型上(仅限vue2使用)
Vue.prototype.$echarts = echarts//将echarts挂载到vue的原型上
然后再所需要的组件里创建一个容器
<div id="chartsBox"></div>
将echarts绑定到dom元素上
this.myEchart = this.$echarts.init(document.querySelector("#chartsBox")); //将echarts绑定到dom元素上
配置echarts的配置
this.option = { //echarts的配置文件 title: { //title组件 text: "Les Miserables", //显示的文本 subtext: "Default layout", top: "bottom", //组件在echarts上下的位置 left: "right", //组件在echarts左右上的位置 }, tooltip: { //提示框组件当鼠标移入时触发 show: true, //是否显示提示框组件。 trigger: "item", //触发类型 }, legend: [ //图例组件 { data: this.graph.categories.map(function (a) { //图例所要分类的种类 return a.name; }), }, ], series: [ //数据展示组件 { name: "Les Miserables", //组件的名称 type: "graph", //组件的类行,选择graph即关系图 layout: "force", //graph的了类型,此时为力引导 data: this.graph.nodes, //要展示的数据 links: this.graph.links, //要展示的关系线 categories: this.graph.categories, //展示的所有分类 roam: true, //是否可以缩放 label: { //graph节点的标签 position: "right", //标签所在的位置 show: false, //是否默认显示标签 }, force: { //力引导的配置 repulsion: 100, //节点之间的斥力 }, scaleLimit: { //滚轮缩放的极限控制 max: 12, //滚轮缩放最大值 min: 3, //滚轮缩放的最小值 }, }, ], };
通过echarts的配置文件进行渲染
this.myEchart.setOption(this.option); //通过echarts的配置文件进行渲染
以上就是全部步骤了实例代码如下
<template> <div id="chartsBox"></div> </template> <script> export default { name: "", data() { return { myEchart: {}, graph: { nodes: [ { id: "0", name: "Myriel", symbolSize: 5, x: -266.82776, y: 299.6904, value: 28.685715, category: 0, }, { id: "1", name: "Napoleon", symbolSize: 5, x: -418.08344, y: 446.8853, value: 4, category: 0, }, { id: "2", name: "MlleBaptistine", symbolSize: 5, x: -212.76357, y: 245.29176, value: 9.485714, category: 1, }, { id: "3", name: "MmeMagloire", symbolSize: 5, x: -242.82404, y: 235.26283, value: 9.485714, category: 1, }, { id: "4", name: "CountessDeLo", symbolSize: 5, x: -379.30386, y: 429.06424, value: 4, category: 0, }, { id: "5", name: "Geborand", symbolSize: 5, x: -417.26337, y: 406.03506, value: 4, category: 0, }, { id: "6", name: "Champtercier", symbolSize: 5, x: -332.6012, y: 485.16974, value: 4, category: 0, }, { id: "7", name: "Cravatte", symbolSize: 5, x: -382.69568, y: 475.09113, value: 4, category: 0, }, { id: "8", name: "Count", symbolSize: 5, x: -320.384, y: 387.17325, value: 4, category: 0, }, { id: "9", name: "OldMan", symbolSize: 5, x: -344.39832, y: 451.16772, value: 4, category: 0, }, { id: "10", name: "Labarre", symbolSize: 5, x: -89.34107, y: 234.56128, value: 4, category: 1, }, { id: "11", name: "Valjean", symbolSize: 5, x: -87.93029, y: -6.8120565, value: 100, category: 1, }, { id: "12", name: "Marguerite", symbolSize: 5, x: -339.77908, y: -184.69139, value: 6.742859, category: 1, }, { id: "13", name: "MmeDeR", symbolSize: 5, x: -194.31313, y: 178.55301, value: 4, category: 1, }, { id: "14", name: "Isabeau", symbolSize: 5, x: -158.05168, y: 201.99768, value: 4, category: 1, }, { id: "15", name: "Gervais", symbolSize: 5, x: -127.701546, y: 242.55057, value: 4, category: 1, }, { id: "16", name: "Tholomyes", symbolSize: 5, x: -385.2226, y: -393.5572, value: 25.942856, category: 2, }, { id: "17", name: "Listolier", symbolSize: 5, x: -516.55884, y: -393.98975, value: 20.457146, category: 2, }, { id: "18", name: "Fameuil", symbolSize: 5, x: -464.79382, y: -493.57944, value: 20.457146, category: 2, }, { id: "19", name: "Blacheville", symbolSize: 5, x: -515.1624, y: -456.9891, value: 20.457146, category: 2, }, { id: "20", name: "Favourite", symbolSize: 5, x: -408.12122, y: -464.5048, value: 20.457146, category: 2, }, { id: "21", name: "Dahlia", symbolSize: 5, x: -456.44113, y: -425.13303, value: 20.457146, category: 2, }, { id: "22", name: "Zephine", symbolSize: 5, x: -459.1107, y: -362.5133, value: 20.457146, category: 2, }, { id: "23", name: "Fantine", symbolSize: 5, x: -313.42786, y: -289.44803, value: 42.4, category: 2, }, { id: "24", name: "MmeThenardier", symbolSize: 5, x: 4.6313396, y: -273.8517, value: 31.428574, category: 7, }, { id: "25", name: "Thenardier", symbolSize: 5, x: 82.80825, y: -203.1144, value: 45.142853, category: 7, }, { id: "26", name: "Cosette", symbolSize: 5, x: 78.64646, y: -31.512747, value: 31.428574, category: 6, }, { id: "27", name: "Javert", symbolSize: 5, x: -81.46074, y: -204.20204, value: 47.88571, category: 7, }, { id: "28", name: "Fauchelevent", symbolSize: 5, x: -225.73984, y: 82.41631, value: 12.228573, category: 4, }, { id: "29", name: "Bamatabois", symbolSize: 5, x: -385.6842, y: -20.206686, value: 23.2, category: 3, }, { id: "30", name: "Perpetue", symbolSize: 5, x: -403.92447, y: -197.69823, value: 6.742859, category: 2, }, { id: "31", name: "Simplice", symbolSize: 5, x: -281.4253, y: -158.45137, value: 12.228573, category: 2, }, { id: "32", name: "Scaufflaire", symbolSize: 5, x: -122.41348, y: 210.37503, value: 4, category: 1, }, { id: "33", name: "Woman1", symbolSize: 5, x: -234.6001, y: -113.15067, value: 6.742859, category: 1, }, { id: "34", name: "Judge", symbolSize: 5, x: -387.84915, y: 58.7059, value: 17.714287, category: 3, }, { id: "35", name: "Champmathieu", symbolSize: 5, x: -338.2307, y: 87.48405, value: 17.714287, category: 3, }, { id: "36", name: "Brevet", symbolSize: 5, x: -453.26874, y: 58.94648, value: 17.714287, category: 3, }, { id: "37", name: "Chenildieu", symbolSize: 5, x: -386.44904, y: 140.05937, value: 17.714287, category: 3, }, { id: "38", name: "Cochepaille", symbolSize: 5, x: -446.7876, y: 123.38005, value: 17.714287, category: 3, }, { id: "39", name: "Pontmercy", symbolSize: 5, x: 336.49738, y: -269.55914, value: 9.485714, category: 6, }, { id: "40", name: "Boulatruelle", symbolSize: 5, x: 29.187843, y: -460.13132, value: 4, category: 7, }, { id: "41", name: "Eponine", symbolSize: 5, x: 238.36697, y: -210.00926, value: 31.428574, category: 7, }, { id: "42", name: "Anzelma", symbolSize: 5, x: 189.69513, y: -346.50662, value: 9.485714, category: 7, }, { id: "43", name: "Woman2", symbolSize: 5, x: -187.00418, y: -145.02663, value: 9.485714, category: 6, }, { id: "44", name: "MotherInnocent", symbolSize: 5, x: -252.99521, y: 129.87549, value: 6.742859, category: 4, }, { id: "45", name: "Gribier", symbolSize: 5, x: -296.07935, y: 163.11964, value: 4, category: 4, }, { id: "46", name: "Jondrette", symbolSize: 5, x: 550.3201, y: 522.4031, value: 4, category: 5, }, { id: "47", name: "MmeBurgon", symbolSize: 5, x: 488.13535, y: 356.8573, value: 6.742859, category: 5, }, { id: "48", name: "Gavroche", symbolSize: 5, x: 387.89572, y: 110.462326, value: 61.600006, category: 8, }, { id: "49", name: "Gillenormand", symbolSize: 5, x: 126.4831, y: 68.10622, value: 20.457146, category: 6, }, { id: "50", name: "Magnon", symbolSize: 5, x: 127.07365, y: -113.05923, value: 6.742859, category: 6, }, { id: "51", name: "MlleGillenormand", symbolSize: 5, x: 162.63559, y: 117.6565, value: 20.457146, category: 6, }, { id: "52", name: "MmePontmercy", symbolSize: 5, x: 353.66415, y: -205.89165, value: 6.742859, category: 6, }, { id: "53", name: "MlleVaubois", symbolSize: 5, x: 165.43939, y: 339.7736, value: 4, category: 6, }, { id: "54", name: "LtGillenormand", symbolSize: 5, x: 137.69348, y: 196.1069, value: 12.228573, category: 6, }, { id: "55", name: "Marius", symbolSize: 5, x: 206.44687, y: -13.805411, value: 53.37143, category: 6, }, { id: "56", name: "BaronessT", symbolSize: 5, x: 194.82993, y: 224.78036, value: 6.742859, category: 6, }, { id: "57", name: "Mabeuf", symbolSize: 5, x: 597.6618, y: 135.18481, value: 31.428574, category: 8, }, { id: "58", name: "Enjolras", symbolSize: 5, x: 355.78366, y: -74.882454, value: 42.4, category: 8, }, { id: "59", name: "Combeferre", symbolSize: 5, x: 515.2961, y: -46.167564, value: 31.428574, category: 8, }, { id: "60", name: "Prouvaire", symbolSize: 5, x: 614.29285, y: -69.3104, value: 25.942856, category: 8, }, { id: "61", name: "Feuilly", symbolSize: 5, x: 550.1917, y: -128.17537, value: 31.428574, category: 8, }, { id: "62", name: "Courfeyrac", symbolSize: 5, x: 436.17184, y: -12.7286825, value: 36.91429, category: 8, }, { id: "63", name: "Bahorel", symbolSize: 5, x: 602.55225, y: 16.421427, value: 34.17143, category: 8, }, { id: "64", name: "Bossuet", symbolSize: 5, x: 455.81955, y: -115.45826, value: 36.91429, category: 8, }, { id: "65", name: "Joly", symbolSize: 5, x: 516.40784, y: 47.242233, value: 34.17143, category: 8, }, { id: "66", name: "Grantaire", symbolSize: 5, x: 646.4313, y: -151.06331, value: 28.685715, category: 8, }, { id: "67", name: "MotherPlutarch", symbolSize: 5, x: 668.9568, y: 204.65488, value: 4, category: 8, }, { id: "68", name: "Gueulemer", symbolSize: 5, x: 78.4799, y: -347.15146, value: 28.685715, category: 7, }, { id: "69", name: "Babet", symbolSize: 5, x: 150.35959, y: -298.50797, value: 28.685715, category: 7, }, { id: "70", name: "Claquesous", symbolSize: 5, x: 137.3717, y: -410.2809, value: 28.685715, category: 7, }, { id: "71", name: "Montparnasse", symbolSize: 5, x: 234.87747, y: -400.85983, value: 25.942856, category: 7, }, { id: "72", name: "Toussaint", symbolSize: 5, x: 40.942253, y: 113.78272, value: 9.485714, category: 1, }, { id: "73", name: "Child1", symbolSize: 5, x: 437.939, y: 291.58234, value: 6.742859, category: 8, }, { id: "74", name: "Child2", symbolSize: 5, x: 466.04922, y: 283.3606, value: 6.742859, category: 8, }, { id: "75", name: "Brujon", symbolSize: 5, x: 238.79364, y: -314.06345, value: 20.457146, category: 7, }, { id: "76", name: "MmeHucheloup", symbolSize: 5, x: 712.18353, y: 4.8131495, value: 20.457146, category: 8, }, ], links: [ { source: "1", target: "0" }, { source: "2", target: "0" }, { source: "3", target: "0" }, { source: "3", target: "2" }, { source: "4", target: "0" }, { source: "5", target: "0" }, { source: "6", target: "0" }, { source: "7", target: "0" }, { source: "8", target: "0" }, { source: "9", target: "0" }, { source: "11", target: "0" }, { source: "11", target: "2" }, { source: "11", target: "3" }, { source: "11", target: "10" }, { source: "12", target: "11" }, { source: "13", target: "11" }, { source: "14", target: "11" }, { source: "15", target: "11" }, { source: "17", target: "16" }, { source: "18", target: "16" }, { source: "18", target: "17" }, { source: "19", target: "16" }, { source: "19", target: "17" }, { source: "19", target: "18" }, { source: "20", target: "16" }, { source: "20", target: "17" }, { source: "20", target: "18" }, { source: "20", target: "19" }, { source: "21", target: "16" }, { source: "21", target: "17" }, { source: "21", target: "18" }, { source: "21", target: "19" }, { source: "21", target: "20" }, { source: "22", target: "16" }, { source: "22", target: "17" }, { source: "22", target: "18" }, { source: "22", target: "19" }, { source: "22", target: "20" }, { source: "22", target: "21" }, { source: "23", target: "11" }, { source: "23", target: "12" }, { source: "23", target: "16" }, { source: "23", target: "17" }, { source: "23", target: "18" }, { source: "23", target: "19" }, { source: "23", target: "20" }, { source: "23", target: "21" }, { source: "23", target: "22" }, { source: "24", target: "11" }, { source: "24", target: "23" }, { source: "25", target: "11" }, { source: "25", target: "23" }, { source: "25", target: "24" }, { source: "26", target: "11" }, { source: "26", target: "16" }, { source: "26", target: "24" }, { source: "26", target: "25" }, { source: "27", target: "11" }, { source: "27", target: "23" }, { source: "27", target: "24" }, { source: "27", target: "25" }, { source: "27", target: "26" }, { source: "28", target: "11" }, { source: "28", target: "27" }, { source: "29", target: "11" }, { source: "29", target: "23" }, { source: "29", target: "27" }, { source: "30", target: "23" }, { source: "31", target: "11" }, { source: "31", target: "23" }, { source: "31", target: "27" }, { source: "31", target: "30" }, { source: "32", target: "11" }, { source: "33", target: "11" }, { source: "33", target: "27" }, { source: "34", target: "11" }, { source: "34", target: "29" }, { source: "35", target: "11" }, { source: "35", target: "29" }, { source: "35", target: "34" }, { source: "36", target: "11" }, { source: "36", target: "29" }, { source: "36", target: "34" }, { source: "36", target: "35" }, { source: "37", target: "11" }, { source: "37", target: "29" }, { source: "37", target: "34" }, { source: "37", target: "35" }, { source: "37", target: "36" }, { source: "38", target: "11" }, { source: "38", target: "29" }, { source: "38", target: "34" }, { source: "38", target: "35" }, { source: "38", target: "36" }, { source: "38", target: "37" }, { source: "39", target: "25" }, { source: "40", target: "25" }, { source: "41", target: "24" }, { source: "41", target: "25" }, { source: "42", target: "24" }, { source: "42", target: "25" }, { source: "42", target: "41" }, { source: "43", target: "11" }, { source: "43", target: "26" }, { source: "43", target: "27" }, { source: "44", target: "11" }, { source: "44", target: "28" }, { source: "45", target: "28" }, { source: "47", target: "46" }, { source: "48", target: "11" }, { source: "48", target: "25" }, { source: "48", target: "27" }, { source: "48", target: "47" }, { source: "49", target: "11" }, { source: "49", target: "26" }, { source: "50", target: "24" }, { source: "50", target: "49" }, { source: "51", target: "11" }, { source: "51", target: "26" }, { source: "51", target: "49" }, { source: "52", target: "39" }, { source: "52", target: "51" }, { source: "53", target: "51" }, { source: "54", target: "26" }, { source: "54", target: "49" }, { source: "54", target: "51" }, { source: "55", target: "11" }, { source: "55", target: "16" }, { source: "55", target: "25" }, { source: "55", target: "26" }, { source: "55", target: "39" }, { source: "55", target: "41" }, { source: "55", target: "48" }, { source: "55", target: "49" }, { source: "55", target: "51" }, { source: "55", target: "54" }, { source: "56", target: "49" }, { source: "56", target: "55" }, { source: "57", target: "41" }, { source: "57", target: "48" }, { source: "57", target: "55" }, { source: "58", target: "11" }, { source: "58", target: "27" }, { source: "58", target: "48" }, { source: "58", target: "55" }, { source: "58", target: "57" }, { source: "59", target: "48" }, { source: "59", target: "55" }, { source: "59", target: "57" }, { source: "59", target: "58" }, { source: "60", target: "48" }, { source: "60", target: "58" }, { source: "60", target: "59" }, { source: "61", target: "48" }, { source: "61", target: "55" }, { source: "61", target: "57" }, { source: "61", target: "58" }, { source: "61", target: "59" }, { source: "61", target: "60" }, { source: "62", target: "41" }, { source: "62", target: "48" }, { source: "62", target: "55" }, { source: "62", target: "57" }, { source: "62", target: "58" }, { source: "62", target: "59" }, { source: "62", target: "60" }, { source: "62", target: "61" }, { source: "63", target: "48" }, { source: "63", target: "55" }, { source: "63", target: "57" }, { source: "63", target: "58" }, { source: "63", target: "59" }, { source: "63", target: "60" }, { source: "63", target: "61" }, { source: "63", target: "62" }, { source: "64", target: "11" }, { source: "64", target: "48" }, { source: "64", target: "55" }, { source: "64", target: "57" }, { source: "64", target: "58" }, { source: "64", target: "59" }, { source: "64", target: "60" }, { source: "64", target: "61" }, { source: "64", target: "62" }, { source: "64", target: "63" }, { source: "65", target: "48" }, { source: "65", target: "55" }, { source: "65", target: "57" }, { source: "65", target: "58" }, { source: "65", target: "59" }, { source: "65", target: "60" }, { source: "65", target: "61" }, { source: "65", target: "62" }, { source: "65", target: "63" }, { source: "65", target: "64" }, { source: "66", target: "48" }, { source: "66", target: "58" }, { source: "66", target: "59" }, { source: "66", target: "60" }, { source: "66", target: "61" }, { source: "66", target: "62" }, { source: "66", target: "63" }, { source: "66", target: "64" }, { source: "66", target: "65" }, { source: "67", target: "57" }, { source: "68", target: "11" }, { source: "68", target: "24" }, { source: "68", target: "25" }, { source: "68", target: "27" }, { source: "68", target: "41" }, { source: "68", target: "48" }, { source: "69", target: "11" }, { source: "69", target: "24" }, { source: "69", target: "25" }, { source: "69", target: "27" }, { source: "69", target: "41" }, { source: "69", target: "48" }, { source: "69", target: "68" }, { source: "70", target: "11" }, { source: "70", target: "24" }, { source: "70", target: "25" }, { source: "70", target: "27" }, { source: "70", target: "41" }, { source: "70", target: "58" }, { source: "70", target: "68" }, { source: "70", target: "69" }, { source: "71", target: "11" }, { source: "71", target: "25" }, { source: "71", target: "27" }, { source: "71", target: "41" }, { source: "71", target: "48" }, { source: "71", target: "68" }, { source: "71", target: "69" }, { source: "71", target: "70" }, { source: "72", target: "11" }, { source: "72", target: "26" }, { source: "72", target: "27" }, { source: "73", target: "48" }, { source: "74", target: "48" }, { source: "74", target: "73" }, { source: "75", target: "25" }, { source: "75", target: "41" }, { source: "75", target: "48" }, { source: "75", target: "68" }, { source: "75", target: "69" }, { source: "75", target: "70" }, { source: "75", target: "71" }, { source: "76", target: "48" }, { source: "76", target: "58" }, { source: "76", target: "62" }, { source: "76", target: "63" }, { source: "76", target: "64" }, { source: "76", target: "65" }, { source: "76", target: "66" }, ], categories: [ { name: "A" }, { name: "B" }, { name: "C" }, { name: "D" }, { name: "E" }, { name: "F" }, { name: "G" }, { name: "H" }, { name: "I" }, ], }, }; }, created() {}, mounted() { this.init(); }, methods: { init() { this.myEchart = this.$echarts.init(document.querySelector("#chartsBox")); //将echarts绑定到dom元素上 this.option = { //echarts的配置文件 title: { //title组件 text: "Les Miserables", //显示的文本 subtext: "Default layout", top: "bottom", //组件在echarts上下的位置 left: "right", //组件在echarts左右上的位置 }, tooltip: { //提示框组件当鼠标移入时触发 show: true, //是否显示提示框组件。 trigger: "item", //触发类型 }, legend: [ //图例组件 { data: this.graph.categories.map(function (a) { //图例所要分类的种类 return a.name; }), }, ], series: [ //数据展示组件 { name: "Les Miserables", //组件的名称 type: "graph", //组件的类行,选择graph即关系图 layout: "force", //graph的了类型,此时为力引导 data: this.graph.nodes, //要展示的数据 links: this.graph.links, //要展示的关系线 categories: this.graph.categories, //展示的所有分类 roam: true, //是否可以缩放 label: { //graph节点的标签 position: "right", //标签所在的位置 show: false, //是否默认显示标签 }, force: { //力引导的配置 repulsion: 100, //节点之间的斥力 }, scaleLimit: { //滚轮缩放的极限控制 max: 12, //滚轮缩放最大值 min: 3, //滚轮缩放的最小值 }, }, ], }; this.myEchart.setOption(this.option); //通过echarts的配置文件进行渲染 }, }, }; </script> <style scoped> #chartsBox { width: 100%; height: 100vh; } </style>
vue中关系图组件
1.Graph.vue
<template> <div class="yh-graph"></div> </template> <script> var _POS = [ [-1, -0.35], [1.0, 0.1], [0.72, -0.45], [-0.75, 0.25], [0.4, -0.75], [-0.5, -0.55], [0.45, 0.2], [-0.15, -0.66] ]; var _N_RADIUS = 600; function _position(node, i) { if (i == 0) { node.x = 0; node.y = 0; } else { i = i - 1; var k = i % _POS.length; var p = _POS[k]; var r = _N_RADIUS * (i / _POS.length + 1); node.x = p[0] * r; node.y = p[1] * r; } } function _create_nodes(nodes) { var arr = []; var i = 0; nodes.forEach(function(e) { var n = {}; n.id = e.id; n.name = e.name; var s = e.size; n.value = s; n.symbolSize = s; if (e.image) { n.symbol = "image://" + e.image; } _position(n, i++); arr.push(n); }); return arr; } function _create_links(links) { var arr = []; links.forEach(function(e) { var l = {}; l.id = e.id; l.name = e.name; l.source = e.source; l.target = e.target; arr.push(l); }); return arr; } function showGraph(chart, nodes, links) { var option = { series: [ { name: "g1", type: "graph", animation: false, data: nodes, links: links, roam: false, focusNodeAdjacency: true, itemStyle: { normal: { color: "#999", backgroundColor: "#fff", borderColor: "#fff", borderWidth: 1, shadowBlur: 10, shadowColor: "rgba(0, 0, 0, 0.3)" } }, label: { show: true, position: "bottom", color: "#000", formatter: "{b}" }, force: { repulsion: 10000 }, lineStyle: { type: "solid", color: "#666", curveness: 0.3, opacity: 0.9, width: 3 }, edgeLabel: { show: true, formatter: function(params) { return params.data["name"]; }, color: "#fff", borderColor: "#666", backgroundColor: "#666", borderWidth: 1, borderRadius: 3, padding: [2, 5, 2, 5] }, emphasis: { lineStyle: { width: 10 } } } ] }; chart.setOption(option); chart.dispatchAction({ type: "unfocusNodeAdjacency", seriesIndex: 0, dataIndex: 0 }); } export default { name: "YhGraph", data() { return { nodes: [], links: [] }; }, methods: { onLinkClick(link) { this.$emit("select-link", { id: link.id, name: link.name, source: this.getNodeDesc(link.source), target: this.getNodeDesc(link.target) }); }, getNodeDesc(id) { var nodes = this.nodes; for (var i = 0; i < nodes.length; ++i) { var n = nodes[i]; if (n.id == id) { return { id: id, name: n.name }; } } }, updateLinkName(id, name) { var links = this.links; for (var i = 0; i < links.length; ++i) { var n = links[i]; if (n.id == id) { n.name = name; var chart = this.$chart; chart.clear(); showGraph(chart, this.nodes, this.links); } } }, show(g) { this.nodes = _create_nodes(g.nodes); this.links = _create_links(g.links); showGraph(this.$chart, this.nodes, this.links); } }, mounted() { var chart = echarts.init(this.$el); var vm = this; chart.on("click", function(params) { if (params.seriesIndex == 0 && params.dataType == "edge") { vm.onLinkClick(params.data); } }); this.$chart = chart; } }; </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> </style>
2.GraphDemo.vue
<template> <div class="yh-page"> <h1>关系图演示</h1> <div class="desc"> Demo源代码: </div> <div class="yh-block" style="align:top"> <yh-graph ref="graph" style="width:500px;height:400px;display:inline-block" @select-link="onLinkSelect" ></yh-graph> <div class="rel-form"> <el-form v-show="editing" :model="rel" label-width="50px" class="yh-small"> <div style="padding-left:50px">{{rel.source}} 与 {{rel.target}}</div> <el-form-item label="关系"> <el-input v-model="rel.name" size="small"></el-input> </el-form-item> <yh-button class="yh-primary" @click="onSaveClick">确定</yh-button> </el-form> </div> </div> </div> </template> <script> import graph from "../../components/comcompont/echarts/Graph"; import yhbutton from "../../components/comcompont/Button"; export default { name: "GraphDemo", data() { return { rel: { id: "", source: "", target: "", oldName: "", name: "" }, editing: false, graph: { nodes: [ { id: "0", name: "客户1", size: 100, image: "/images/ic_head.png" }, { id: "1", name: "A", size: 70 }, { id: "2", name: "B", size: 70 }, { id: "3", name: "C", size: 70 }, { id: "4", name: "D", size: 70 }, { id: "5", name: "E", size: 70 }, { id: "6", name: "F", size: 70 }, { id: "7", name: "G", size: 70 }, { id: "8", name: "H", size: 70 } ], links: [ { id: "0", name: "夫妻", source: "0", target: "1" }, { id: "1", name: "父子", source: "0", target: "2" }, { id: "2", name: "母子", source: "0", target: "3" }, { id: "3", name: "父子", source: "0", target: "4" }, { id: "4", name: "同事", source: "0", target: "5" }, { id: "5", name: "同事", source: "0", target: "6" }, { id: "6", name: "同事", source: "0", target: "7" }, { id: "7", name: "同事", source: "0", target: "8" } ] } }; }, methods: { onLinkSelect(link) { var r = this.rel; r.id = link.id; r.name = link.name; r.oldName = link.name; r.source = link.source.name; r.target = link.target.name; this.editing = true; }, onSaveClick() { var rel = this.rel; if (rel.oldName != rel.name) { this.$refs.graph.updateLinkName(rel.id, rel.name); } this.editing = false; } }, mounted() { this.$refs.graph.show(this.graph); }, components: { "yh-graph": graph, "yh-button": yhbutton } }; </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scope> .rel-form { width: 300px; height: 400px; display: inline-block; float: right; margin-right: 20px; margin-top: 20px; } </style>
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。