【问题标题】:How to import and use D3-tube-map in react.js如何在 react.js 中导入和使用 D3-tube-map
【发布时间】:2019-04-20 11:44:39
【问题描述】:

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

以下是我正在使用的代码。我已经使用 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;

【问题讨论】:

  • 从 2018-11-16 09:33:17Z stackoverflow.com/questions/53334987/… 删除您的问题并在 30 小时后于 2018-11-17 14:35:40Z 发布相同问题的原因是什么?这是您第三次发布相同的问题
  • 因为我想要一个解决方案,可能这里没有注意到问题,我不知道为什么。

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


【解决方案1】:

是的,您的导入不太正确。如果您查看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 上与作者一起打开一个问题以获取示例。

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

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.

【讨论】:

  • 非常感谢您抽出宝贵时间@Todd。我刚刚尝试了第一个解决方案,即仅导入 d3-tube-map 并导致错误 - d3.tubeMap 不是函数 并且还尝试了第二个选项来导入 d3 和 d3- tube-map,这种情况也会导致错误 - Uncaught TypeError: _d2.default.tubeMap is not a function
  • @Subhojit 我不确定如何正确导入,但下一步你应该在 git repo 中打开一个问题。同时,如果您想在jsfiddle.net 上发布您的代码并将链接添加到您的问题中,我很乐意看看我是否可以让它工作并更新我的答案。
  • 问题得到了解决,因为我缺少从 d3-tube-map 库中正确导入属性,所以我使用 import * as tubeMap from 'd3-tube-map'问题得到解决。感谢@Todd 提供帮助。
  • 这是工作演示 - stackblitz.com/edit/react-9sfz89
  • @Subhojit 感谢您的反馈,我通过使用 const d3 = Object.assign(d3Base, { tubeMap.tubeMap }); 而不是 d3.tubeMap = tubeMap 摆脱了警告
猜你喜欢
  • 1970-01-01
  • 2022-07-07
  • 2016-07-21
  • 2022-01-18
  • 1970-01-01
  • 2017-11-24
  • 2019-04-23
  • 2016-06-11
  • 2020-07-28
相关资源
最近更新 更多