如何在react.js中导入和使用D3-tube-map

时间:2018-11-17 14:35:40

标签: javascript reactjs d3.js react-redux react-component

我在我的reactjs项目中从d3.js导入了tube-map。但是由于未正确导入而出现以下问题。我遇到的问题显示在以下sceenshot中:

enter image description here

以下是我正在使用的代码。我已经使用npm安装了d3-tube-map。也许我缺少正确导入d3-tube-map的导出值的方法。关于这个问题有帮助吗?

import React, { Component } from "react";
// import d3 from "d3";
import d3 from "d3-tube-map";
import "d3-tip";
import tubeData from "./JSON/tube_data.jsx";

class TubeMap extends Component {
    componentDidMount() {
        var container = d3.select("#tube_map_101");
        var width = 700;
        var height = 400;

        var map = d3
            .tubeMap()
            .width(width)
            .height(height)
            .margin({
                top: 20,
                right: 20,
                bottom: 40,
                left: 100
            })
            .on("click", function(name) {
                console.log(name);
            });

        // d3.json("./stations.json", function (error, data) {
        container.datum(tubeData).call(map);

        var svg = container.select("svg");

        zoom = d3
            .zoom()
            .scaleExtent([0.5, 6])
            .on("zoom", zoomed);

        var zoomContainer = svg.call(zoom);
        var initialScale = 2;
        var initialTranslate = [100, 200];

        zoom.scaleTo(zoomContainer, initialScale);
        zoom.translateTo(
            zoomContainer,
            initialTranslate[0],
            initialTranslate[1]
        );

        function zoomed() {
            svg.select("g").attr("transform", d3.event.transform.toString());
        }
        // });
    }

    render() {
        return <div id="tube_map_101" />;
    }
}

export default TubeMap;

1 个答案:

答案 0 :(得分:0)

是的,您的进口商品不太正确。如果您查看npm page for this module上提供的示例,则它同时使用d3和d3-tube-map。

<script src="https://d3js.org/d3.v4.js"></script>
<script src="../dist/d3-tube-map.js"></script>

这给出了一个线索,但是在使用ES6导入时如何做却无济于事。查看module over on github的代码,我将首先尝试一下(排除很多行):

import tubeMap from "d3-tube-map";

...

    var map = tubeMap() 

我在github上注意到的是tubeMap模块已经在其中导入了d3。因此,也许您不需要自己导入d3。

如果上述方法不起作用,则可能必须同时导入d3和d3-tube-map,在这种情况下,我不确定它们应如何一起用作导入。如果是这样,我会在github上与作者一起打开一个问题,以获取示例。

编辑:事实证明,您需要按照下面的代码片段从每个模块导入所有组件。

import * as d3 from "d3";
import * as tubeMap from "d3-tube-map";
import tubeData from "./data/tubeData.jsx";

class TubeMap extends Component {
    componentDidMount () {
      d3.tubeMap = tubeMap.tubeMap
      this.renderMap()
    }


    renderMap() {
        var container = d3.select("#tube_map_101");
        var width = 700;
        var height = 400;

        var map = d3
            .tubeMap()
            .width(width)
            .height(height)

etc.