【问题标题】:How to use d3 with reactJS / nextJS?如何将 d3 与 reactJS / nextJS 一起使用?
【发布时间】:2023-03-14 05:03:01
【问题描述】:

我想按照教程添加一个 d3 图表,但根本没有任何反应。我实际上不确定 useEffect() 是否处于良好的“时机”,我是否应该使用 componentDidMount,或者它是否不是添加元素的好方法......似乎我在这里遗漏了一些东西!

import React from 'react';
import * as d3 from "d3";
import { useEffect } from 'react';

function drawChart() {
  const data = [12, 5, 6, 6, 9, 10];
  const h = 100;
  const w = 100;
  const svg = d3.select("body")
    .append("svg")
    .attr("width", w)
    .attr("height", h)
    .style("margin-left", 100);
                  
    svg.selectAll("rect")
      .data(data)
      .enter()
      .append("rect")
      .attr("x", (d, i) => i * 70)
      .attr("y", (d, i) => h - 10 * d)
      .attr("width", 65)
      .attr("height", (d, i) => d * 10)
      .attr("fill", "green")
}


const chart: React.FunctionComponent = () => {
  useEffect(() => {
    drawChart();
  }, []);
  
  return (
    <div>
    </div>
  );
};
export default chart;

【问题讨论】:

  • 你说的什么都没有发生是什么意思?你的图表does work.

标签: reactjs d3.js next.js


【解决方案1】:

本示例中的错误来源可能是 d3 将 SVG 附加到正文中,这完全在 React DOM 之外。

更好的方法是在 JSX 中添加 SVG,并使用引用(钩子中的 useRef)告诉 D3 必须在哪里呈现图表:

import * as React from "react";
import * as d3 from "d3";

function drawChart(svgRef: React.RefObject<SVGSVGElement>) {
  const data = [12, 5, 6, 6, 9, 10];
  const h = 120;
  const w = 250;
  const svg = d3.select(svgRef.current);

  svg
    .attr("width", w)
    .attr("height", h)
    .style("margin-top", 50)
    .style("margin-left", 50);

  svg
    .selectAll("rect")
    .data(data)
    .enter()
    .append("rect")
    .attr("x", (d, i) => i * 40)
    .attr("y", (d, i) => h - 10 * d)
    .attr("width", 20)
    .attr("height", (d, i) => d * 10)
    .attr("fill", "steelblue");
}

const Chart: React.FunctionComponent = () => {
  const svg = React.useRef<SVGSVGElement>(null);

  React.useEffect(() => {
    drawChart(svg);
  }, [svg]);

  return (
    <div id="chart">
      <svg ref={svg} />
    </div>
  );
};

export default Chart;

Here is a codePen for the example

【讨论】:

    猜你喜欢
    • 2020-08-17
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    相关资源
    最近更新 更多