vue 中 使用 dagre-d3 來設(shè)置關(guān)系圖

本來要直接用D3的tree來實(shí)現(xiàn)樹結(jié)構(gòu)的,后來添加了新需求,2個父節(jié)點(diǎn)指向同一個子節(jié)點(diǎn)胞谭,然后就換成了dagre-d3來設(shè)置轿偎,這里來記錄一下

版本使用:d3用的4.13.0,dagre-d3用的0.6.3

效果圖如下:

最終效果圖
var nodes = [
        { id: 0, label: '根節(jié)點(diǎn)', },
        { id: 1, label: '一級節(jié)點(diǎn)1',  },
        { id: 2, label: '一級節(jié)點(diǎn)2',  },
        { id: 3, label: '一級節(jié)點(diǎn)3', },
        { id: 4, label: '一級節(jié)點(diǎn)4', },
        { id: 5, label: '二級節(jié)點(diǎn)1', },
        { id: 6, label: '二級節(jié)點(diǎn)2', },
        { id: 7, label: '三級節(jié)點(diǎn)1', },
        { id: 8, label: '三級節(jié)點(diǎn)2', },
    ];
    var line = [
        { start: 0, end: 1, },
        { start: 0, end: 2, },
        { start: 0, end: 3, },
        { start: 0, end: 4, },
        { start: 1, end: 5, },
        { start: 1, end: 6, },
        { start: 6, end: 7, },
        { start: 1, end: 7, },
        { start: 2, end: 8, },
    ];

關(guān)鍵代碼(在網(wǎng)上找的璧榄,不知道出處是哪里了):

var diagGraph = { //diag圖數(shù)據(jù)操作
    state: [],
    edg: [],
    statePoint: '',
    g: '',
    init: function (statePoint ,state, edg) {
        this.statePoint = statePoint
        this.state = state
        this.edg = edg
        this.createG();
        this.renderG();
    },
    createG: function () {
        this.g = new dagreD3.graphlib.Graph()
        .setGraph({
            rankdir: 'LR' //方向
        })
        .setDefaultEdgeLabel(function () { return {}; });
    },
    drawNode: function () {
        for (let i in this.state) { //畫點(diǎn)
            let el = this.state[i]
            let style = '';
            this.g.setNode(el.id, {
                id: el.id,
                label: el.label,
                class: el.class,
                style: el.node_id,
                node_id: el.node_id,
            });
        }
        this.g.nodes().forEach((v) => { //畫圓角
            var node = this.g.node(v); 
            node.rx = node.ry = 10;
        });
    },
    addNode:function(nodelist){ },
    drawEdg: function () {
        for (let i in this.edg) { // 畫連線
            let el = this.edg[i]
            if (el.start === this.statePoint || el.end === this.statePoint) {
                this.g.setEdge(el.start, el.end, {
                    style: "stroke: #0fb2cc; fill: none;",
                    arrowheadStyle: "fill: #0fb2cc;stroke: #0fb2cc;",
                    arrowhead: 'vee'
                });
            } else {
                this.g.setEdge(el.start, el.end, {
                    arrowhead: 'vee'
                });
            }
        }
    },
    renderG: function () {
        var render = new dagreD3.render();
        var svg = d3.select("#svgCanvas");
        svg.select("g").remove(); //刪除以前的節(jié)點(diǎn)
        var svgGroup = svg.append("g");
        var inner = svg.select("g");
        var zoom = d3.zoom().on("zoom", function () { //放大
        inner.attr("transform", d3.event.transform);
        });
        svg.call(zoom);
        this.drawNode();
        this.drawEdg(); 
        render(d3.select("svg g"), this.g); //渲染節(jié)點(diǎn)
        var max = svg._groups[0][0].clientWidth > svg._groups[0][0].clientHeight ? svg._groups[0][0].clientWidth : svg._groups[0][0].clientHeight;
        // var initialScale = max / 779;
        var initialScale =1;
        var tWidth = (svg._groups[0][0].clientWidth - this.g.graph().width * initialScale) / 2;
        var tHeight = (svg._groups[0][0].clientHeight - this.g.graph().height * initialScale) / 2;
        var trans = d3.zoomIdentity.translate(tWidth, 50).scale(initialScale); //.scale(initialScale) 
        svg.call(zoom.transform,trans); //元素居中
    },
    changePoint: function (point) {
        this.statePoint = point * 1.0
        this.renderG()
    },
}
    var statePoint = 0; // 當(dāng)前選中的點(diǎn) 
    diagGraph.init(statePoint, nodes, line); //創(chuàng)建關(guān)系圖

實(shí)現(xiàn)右鍵效果

contextmenuclick(e){ //右鍵
     if (e.target.tagName === 'rect' || e.target.tagName === 'text') {  
          var value=e.target.__data__;  
          //實(shí)現(xiàn)邏輯
     } else {
          this.menuflag=false;
     } 
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子处渣,更是在濱河造成了極大的恐慌,老刑警劉巖蛛砰,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罐栈,死亡現(xiàn)場離奇詭異,居然都是意外死亡泥畅,警方通過查閱死者的電腦和手機(jī)荠诬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來位仁,“玉大人柑贞,你說我怎么就攤上這事∧羟溃” “怎么了钧嘶?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長琳疏。 經(jīng)常有香客問我有决,道長闸拿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任书幕,我火速辦了婚禮新荤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘按咒。我一直安慰自己迟隅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布励七。 她就那樣靜靜地躺著智袭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掠抬。 梳的紋絲不亂的頭發(fā)上吼野,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機(jī)與錄音两波,去河邊找鬼瞳步。 笑死,一個胖子當(dāng)著我的面吹牛腰奋,可吹牛的內(nèi)容都是我干的单起。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼劣坊,長吁一口氣:“原來是場噩夢啊……” “哼嘀倒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起局冰,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤测蘑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后康二,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碳胳,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年沫勿,在試婚紗的時候發(fā)現(xiàn)自己被綠了挨约。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡产雹,死狀恐怖烫罩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洽故,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布盗誊,位于F島的核電站时甚,受9級特大地震影響隘弊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜荒适,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一梨熙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刀诬,春花似錦咽扇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至糠馆,卻和暖如春嘶伟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背又碌。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工九昧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毕匀。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓铸鹰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親皂岔。 傳聞我的和親對象是個殘疾皇子蹋笼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • d3 (核心部分)選擇集d3.select - 從當(dāng)前文檔中選擇一系列元素。d3.selectAll - 從當(dāng)前文...
    謝大見閱讀 3,443評論 1 4
  • 對集合的操作 關(guān)于d3.attr 一個可以處理很多情況的函數(shù)凤薛,當(dāng)只傳入一個參數(shù)時姓建,如果是string,則返回該屬性...
    陳堅(jiān)生閱讀 2,528評論 0 2
  • 聲明:本文為學(xué)習(xí)總結(jié)篇缤苫,來自一篇比較老的文章速兔,文中的數(shù)據(jù)結(jié)構(gòu)、算法原理講解的通俗易懂活玲,透徹涣狗,值得反復(fù)閱讀。原文出處...
    Vechace閱讀 1,969評論 1 33
  • 好不容易等到放假了舒憾,本該為有幾天可以自由支配的時間而感到高興镀钓,可是,一點(diǎn)也高興不起...
    風(fēng)鈴_fe45閱讀 234評論 0 0
  • 感謝群里的小伙伴貢獻(xiàn)出來的好案例镀迂,感謝童的小灶丁溅。多年來,我也是時常被這個問題弄得迷糊探遵,經(jīng)老師點(diǎn)撥之后窟赏,清晰了很多妓柜。...
    牽著蝸牛散步Nancy閱讀 1,694評論 0 0