VUE和Antv G6實(shí)現(xiàn)在線拓?fù)鋱D編輯操作
效果圖如下:

我使用的是G6 2.0,也可以使用 G6 3.0,3.0的拓?fù)鋱D單獨(dú)作為一個編輯器使用,使用更加方便。不過2.0的比較簡單,容易上手。
1.首先在Antv官網(wǎng)上找到螞蟻Antv G6插件,引入插件。
也可以npm 方式引入。
2.寫組件
export default {
name: “index”,
components: {},
mounted() {
this.initG6();
},
data() {
return {
action: ‘',
name: ‘',
func: ‘',
account: ‘',
workflow: ‘',
nodeType: 0,
color: ‘',
net: ‘',
Util: ‘',
workflowName: ‘',
activation: ‘', //當(dāng)前激活的節(jié)點(diǎn)
isNode: false, //當(dāng)前是節(jié)點(diǎn)
isBlank: true, //當(dāng)前是空白區(qū)
checked: true, //網(wǎng)格對齊
infoTitle: ‘畫布',//屬性標(biāo)題
oldColor: ‘', //獲取節(jié)點(diǎn)本身顏色
type: ‘', //有值為編輯狀態(tài)
actionList:[],
nodeTypeList: [
{id: 0, label: ‘普通節(jié)點(diǎn)'}]
}
},
methods: {
initG6() {
let self = this;
self.Util = G6.Util;
let grid;
if (self.checked) {
grid = {
forceAlign: true, // 是否支持網(wǎng)格對齊
cell: 25, // 網(wǎng)格大小
};
} else {
grid = null;
}
// 生成度量
. . . . . .
// 工具方法
. . . . . .
var sourcesData={ }; //后臺返回的數(shù)據(jù)
var trainScale = function(dim, scale){
var max = -Infinity;
var min = Infinity;
sourcesData.source.nodes.map(function(node){
max =30;
min =25;
});
scale.domain([min, max]);
};
var colors = ['#007AE7', ‘#40BCD2', ‘#81D6C3', ‘#C1E4BC', ‘#FFDD9B', ‘#FEAC4C', ‘#FF7C01', ‘#C4201D'];
. . . . . .
// 生成圖
http://self.net = new http://G6.Net({
id: ‘knowledge', // 容器ID
height: canvasHeight, // 畫布高
mode: ‘edit'
});
G6.Global.nodeLabelStyle = {
fill: ‘#fff',
textAlign: ‘left',
textBaseline: ‘bottom',
fontSize:24
};
self.net.tooltip(true);
self.net.node()
.size(function(model){
return sizeScale(model.weight)*2;
})
;
self.net.source(sourcesData.source.nodes, sourcesData.source.edges);
self.net.removeBehaviour([‘dragCanvas', ‘dragHideEdges', ‘dragHideTexts']);
self.net.addBehaviour([‘dragBlank']);
self.net.read(sourcesData);
self.net.render();
self.net.zoomAt(graphCenterX, graphCenterY, 0.7);
// 生成布局
var layoutNodes = sourcesData.source.nodes;
var layoutEdges = Util.clone(sourcesData.source.edges);
var ticked = function(){
self.net.updateNodesPosition();
};
…
/**
點(diǎn)擊空白處
/
self.net.on(‘click', (ev) => {
if (!self.Util.isNull(ev.item)) {
self.isBlank = false
} else {
self.isBlank = true;
self.infoTitle = ‘畫布'
}
});
/
點(diǎn)擊節(jié)點(diǎn)
/
self.net.on(‘itemclick', function (ev) {
self.isNode = self.Util.isNode(ev.item); //是否為Node
self.activation = ev.item;
if (self.isNode) {
/ 激活節(jié)點(diǎn)后節(jié)點(diǎn)名稱input聚焦/
self.KaTeX parse error: Expected '}', got 'EOF' at end of input: …ick(()=>{ self.refs.inputFocus.$el.querySelector(‘input').focus();
});
self.infoTitle = ‘節(jié)點(diǎn)';
self.name = ev.item.get(‘model').label;
self.func = ev.item.get(‘model').func;
self.account = ev.item.get(‘model').account || [];
self.workflow = ev.item.get(‘model').workflow;
} else {
self.infoTitle = ‘邊';
self.action = ev.item.get(‘model').action;
}
self.color = self.oldColor;
});
/**
鼠標(biāo)移入移出事件改變顏色
/
self.net.on(‘itemmouseenter', ev => {
const item = ev.item;
self.oldColor = item.get(‘model').color; //獲取節(jié)點(diǎn)顏色
self.net.update(item, {
color: ‘#108EE9',
});
self.net.refresh();
});
self.net.on(‘itemmouseleave', ev => {
const item = ev.item;
self.net.update(item, {
color: self.oldColor
});
self.net.refresh();
});
/*
提示信息
*/
self.net.tooltip({
title: ‘信息', // @type {String} 標(biāo)題
split: ‘:', // @type {String} 分割符號
dx: 0, // @type {Number} 水平偏移
dy: 0 // @type {Number} 豎直偏移
});
self.net.edge().tooltip() .size(‘val', function(val){
return 3;
});
/**
渲染
*/
/self.net.source(self.nodes, self.edges);/ //加載資源數(shù)據(jù)
// self.net.render();
},
addCircle() {
},//添加起始節(jié)點(diǎn)
addRect() {
},//添加常規(guī)節(jié)點(diǎn)
addRhombus() {
}, //添加條件節(jié)點(diǎn)
addLine() {
}, //添加直線
addSmooth() {
}, //添加曲線
addArrowSmooth() {
}, //添加箭頭曲線
addArrowLine() {
}, //添加箭頭直線
addPolyLine() {
}, //添加折線
changeMode(mode) {
}, //拖拽與編輯模式的切換
del() {
this.net.del()
},//刪除
save() {
/* 驗(yàn)證流圖名稱*/
if (this.workflowName !== ‘') {
let data = this.net.save();
if (data.source.nodes.length === 0) {
this.KaTeX parse error: Expected 'EOF', got '}' at position 61: …; return false }̲ /* 驗(yàn)證節(jié)點(diǎn)名稱*/ fo…message({type: ‘error', message: ‘節(jié)點(diǎn)名稱不能為空'});
return false
}
}
data.source[‘name'] = this.workflowName;
/let json = JSON.stringify(data, null, 2);/
this.KaTeX parse error: Expected 'EOF', got '}' at position 43: …e, this.type); }̲ else { this.message({type: ‘error', message: ‘拓?fù)涿Q不能為空'})
}
/console.log(saveData, json);/
},//保存
update() {
}, //更新節(jié)點(diǎn)
clearView() {
this.type = ‘';
this.workflowName = ‘';
this.net.changeData()
}, //清空視圖
source(nodes, edges, name, type) {
this.type = type;
this.workflowName = name;
this.net.changeData(nodes, edges)
}, //更新數(shù)據(jù)
},
watch: {
/**
監(jiān)聽輸入框
/
action: function () {
this.update()
},
name: function () {
this.update()
},
func: function () {
this.update()
},
account: function () {
this.update()
},
workflow: function () {
this.update()
},
nodeType: function () {
this.update()
},
color: function () {
this.update()
},
/*
網(wǎng)格切換
*/
checked: function () {
let _saveData = this.net.save();
this.net.destroy(); //銷毀畫布
this.initG6();
this.net.read(_saveData);
this.net.render()
}
}
}
3.注意:
在實(shí)現(xiàn)過程中,我采用了度量的生成方法使節(jié)點(diǎn)均勻分布,否則需要指定節(jié)點(diǎn)的位置。不指定位置頁面不會顯示任何東西。
補(bǔ)充知識:antv G6關(guān)系樹,拓?fù)鋱D 不同層級不同顏色
前端菜雞… 近期遇到一個需求,要求關(guān)系圖每個層級不同顏色展示,位置還得隨機(jī),目前echart實(shí)現(xiàn)后都不太滿意…em 于是G6 …
廢話不多說 看代碼(效果)//
1、引入G6 相關(guān) (基礎(chǔ)數(shù)據(jù)是官方的)
import G6 from '@antv/g6'
fetch('https://gw.alipayobjects.com/os/antvdemo/assets/data/algorithm-category.json')
.then(res => res.json())
.then(data => {
console.log(data)
const width = document.getElementById('map').scrollWidth;
const height = document.getElementById('map').scrollHeight || 500;
const graph= new G6.TreeGraph({
container: 'map',
width,
height,
pixelRatio: 2,
modes: {
default: [{
type: 'collapse-expand',
onChange: function onChange(item, collapsed) {
console.log(item)
const data = item.get('model').data;
data.collapsed = collapsed;
return true;
}
}, 'drag-canvas', 'zoom-canvas']
},
defaultNode: {
size: [200, 50],
shape: 'rect',
style: {
fill: '#C6E5FF',
stroke: '#5B8FF9'
}
},
defaultEdge: {
shape: 'cubic-horizontal',
style: {
stroke: '#A3B1BF'
}
},
layout: {
type: 'mindmap',
direction: 'H',
getHeight: () => {
return 40;
},
getWidth: () => {
return 160;
},
getVGap: () => {
return 10;
},
getHGap: () => {
return 100;
}
}
});
let centerX = 0;
// 以下重點(diǎn)
graph.node(function (node) {
// depth 類似節(jié)點(diǎn)標(biāo)識
if(node.depth == 0){
console.log(node)
return {
size:[100,60],
style:{
fill:'red',
// stroke:''
},
label:node.id
}
}
if(node.depth == 1){
console.log(node)
return {
size:[100,60],
style:{
fill:'blue',
},
label:node.id
}
}
return {
label: node.id, // 設(shè)置顯示名稱
labelCfg: {
// position: node.children && node.children.length > 0 ? 'left' : node.x > centerX ? 'right' : 'left', // 設(shè)置顯示左右
offset: 5
}
};
});
graph.data(data);
graph.render();
graph.fitView();
});
這樣效果就出來了. 不同級不同顏色 看圖

以上這篇VUE和Antv G6實(shí)現(xiàn)在線拓?fù)鋱D編輯操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue 中 get / delete 傳遞數(shù)組參數(shù)方法
這篇文章主要介紹了vue 中 get / delete 傳遞數(shù)組參數(shù)方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
vue+element-plus上傳圖片及回顯問題及數(shù)量限制
本文主要介紹了vue+element-plus上傳圖片及回顯問題及數(shù)量限制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Vue項(xiàng)目使用CDN優(yōu)化首屏加載問題
這篇文章主要介紹了Vue項(xiàng)目使用CDN優(yōu)化首屏加載問題,本文以vue、vuex、vue-touter為例,給大家介紹處理流程,需要的朋友可以參考下2018-04-04
Vue3視頻播放器組件Vue3-video-play新手入門教程
這篇文章主要給大家介紹了關(guān)于Vue3視頻播放器組件Vue3-video-play新手入門教程的相關(guān)資料,本文實(shí)例為大家分享了vue-video-player視頻播放器的使用配置,供大家參考,需要的朋友可以參考下2023-12-12
完美解決vue 項(xiàng)目開發(fā)越久 node_modules包越大的問題
這篇文章主要介紹了vue 項(xiàng)目開發(fā)越久 node_modules包越大的問題及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
Vue父組件和子組件之間數(shù)據(jù)傳遞和方法調(diào)用
vue組件在通信中,無論是子組件向父組件傳值還是父組件向子組件傳值,他們都有一個共同點(diǎn)就是有中間介質(zhì),子向父的介質(zhì)是自定義事件,父向子的介質(zhì)是props中的屬性。2022-12-12
在vue項(xiàng)目中引用Antv G2,以餅圖為例講解
這篇文章主要介紹了在vue項(xiàng)目中引用Antv G2,以餅圖為例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
vue單向以及雙向數(shù)據(jù)綁定方式(v-bind和v-model的使用)
這篇文章主要介紹了vue單向以及雙向數(shù)據(jù)綁定方式(v-bind和v-model的使用),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04

