首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未正确绘制Dagre-D3的React组件

未正确绘制Dagre-D3的React组件
EN

Stack Overflow用户
提问于 2015-08-30 10:33:26
回答 2查看 2.6K关注 0票数 5

我将此Dagre-D3演示转换为React组件。代码如下。

代码语言:javascript
复制
import React from 'react'
import d3 from 'd3'
import dagreD3 from 'dagre-d3'

export default class D3Chart extends React.Component {
    constructor () {
        super();
    }

    componentDidMount() {
        // Create the input graph
        var g = new dagreD3.graphlib.Graph()
          .setGraph({})
          .setDefaultEdgeLabel(function() { return {}; });

        // Here we"re setting nodeclass, which is used by our custom drawNodes function
        // below.
        g.setNode(0,  { label: "TOP",       class: "type-TOP" });
        g.setNode(1,  { label: "S",         class: "type-S" });
        g.setNode(2,  { label: "NP",        class: "type-NP" });
        g.setNode(3,  { label: "DT",        class: "type-DT" });
        g.setNode(4,  { label: "This",      class: "type-TK" });
        g.setNode(5,  { label: "VP",        class: "type-VP" });
        g.setNode(6,  { label: "VBZ",       class: "type-VBZ" });
        g.setNode(7,  { label: "is",        class: "type-TK" });
        g.setNode(8,  { label: "NP",        class: "type-NP" });
        g.setNode(9,  { label: "DT",        class: "type-DT" });
        g.setNode(10, { label: "an",        class: "type-TK" });
        g.setNode(11, { label: "NN",        class: "type-NN" });
        g.setNode(12, { label: "example",   class: "type-TK" });
        g.setNode(13, { label: ".",         class: "type-." });
        g.setNode(14, { label: "sentence",  class: "type-TK" });

        g.nodes().forEach(function(v) {
            var node = g.node(v);
            // Round the corners of the nodes
            node.rx = node.ry = 5;
        });

        // Set up edges, no special attributes.
        g.setEdge(3, 4);
        g.setEdge(2, 3);
        g.setEdge(1, 2);
        g.setEdge(6, 7);
        g.setEdge(5, 6);
        g.setEdge(9, 10);
        g.setEdge(8, 9);
        g.setEdge(11,12);
        g.setEdge(8, 11);
        g.setEdge(5, 8);
        g.setEdge(1, 5);
        g.setEdge(13,14);
        g.setEdge(1, 13);
        g.setEdge(0, 1)

        // Create the renderer
        var render = new dagreD3.render();

        // Set up an SVG group so that we can translate the final graph.
        var svg = d3.select(React.findDOMNode(this.refs.nodeTree));
        var svgGroup = d3.select(React.findDOMNode(this.refs.nodeTreeGroup));

        // Run the renderer. This is what draws the final graph.
        render(d3.select(React.findDOMNode(this.refs.nodeTreeGroup)), g);

        // Center the graph
        var xCenterOffset = (svg.attr("width") - g.graph().width) / 2;
        svgGroup.attr("transform", "translate(" + xCenterOffset + ", 20)");
        svg.attr("height", g.graph().height + 40);
    }

    render() {
        return (<svg id="nodeTree" ref="nodeTree" width="960" height="600"><g ref="nodeTreeGroup"/></svg>
        )
    };
}

问题是节点的渲染不对齐,而且它们的大小也不对齐。

这是它看起来的样子。它应该是什么样的是here

更新:

第一个节点如下所示:

现在是什么样子:

代码语言:javascript
复制
<g class="node type-TOP" transform="translate(100,0)" style="opacity: 1;"><rect rx="5" ry="5" x="-10" y="-10" width="20" height="20"></rect><g class="label" transform="translate(0,0)"><g transform="translate(0,0)"><text><tspan xml:space="preserve" dy="1em" x="1">TOP</tspan></text></g></g></g>

应该是什么:

代码语言:javascript
复制
<g class="node type-TOP" transform="translate(211.25,18)" style="opacity: 1;"><rect rx="5" ry="5" x="-24.5" y="-18" width="49" height="36"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-14.5,-8)"><text><tspan xml:space="preserve" dy="1em" x="1">TOP</tspan></text></g></g></g>

宽度和高度计算不正确。宽度应该是49,但它只有20。

EN

回答 2

Stack Overflow用户

发布于 2015-08-30 13:26:20

在使用findDOMNode捕捉到svg之后,尝试在componentDidMount中设置高度和宽度。

或者尝试这样设置高度和宽度。

代码语言:javascript
复制
style={{height:'900', width:'300'}}

如果有效,请让我知道

票数 1
EN

Stack Overflow用户

发布于 2018-04-06 08:33:01

我已经想出了一个解决方法。我遇到了与您完全相同的问题,通过反复试验,我发现如果您将图表附加到页面的正文中,它会工作得很好。文本和节点对齐,节点大小根据文本进行相应的更改。这并不理想,但这是一种变通方法。

(我不知道react语法,所以请耐心听我说)

而不是像这样预先创建svg节点(不要这样做):

代码语言:javascript
复制
var svg = d3.select(React.findDOMNode(this.refs.nodeTree));

动态构建一个,并将其附加到整个HTML文档的body元素中(执行以下操作):

代码语言:javascript
复制
var svg = d3.select(React.findDOMNode('body'))
            .append('svg')
            .attr('width', 500)
            .attr('height', 500);

我不确定这是为什么,可能是你在弗朗索瓦·理查德的回答中的评论中解释的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32292622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档