TypeError:无法读取属性'选择'在d3中未定义

时间:2018-03-26 15:19:16

标签: reactjs d3.js

我是新来的反应和Dagre-D3。我将这个Dagre-D3 demo转换为React组件。我使用的代码如下所示。

import React from 'react'
import d3 from 'd3'
import dagreD3 from 'dagre-d3'

export default class EventFlow 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
        let render = new dagreD3.render();

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

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

        // Center the graph
        let 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>);
    }
}

但是当我在控制台中运行此代码片段时遇到此错误

TypeError: Cannot read property 'select' of undefined

我试图找出原因。但是不可能。我怎样才能克服这个问题?请有人帮我解决这个问题

1 个答案:

答案 0 :(得分:3)

d3undefined。可能是因为你没有很好地导入它。从npm page开始,如果你想访问所有D3的方法,你应该做

import * as d3 from "d3";