在 React 应用程序中为 D3.js 加载远程图表数据

发布日期:2026-07-03 21:11:03   来源 : 杭州电子商务研究院    浏览量 :9
杭州电子商务研究院 发布日期:2026-07-03 21:11:03  
9

介绍

D3.js 的核心是将数据与可视化结合起来,以便轻松理解和解释大型数据集。通常,这些数据集是动态的,并具有不同的格式。

在本指南中,您将学习如何在 React 应用中使用D3-fetch处理不同的数据格式。D3-fetch 是现代浏览器内置的标准 fetch API 的简单包装器;它使与不同文件格式的交互变得更加方便。

本指南以之前的指南《在 React 应用程序中使用 D3.js》为基础,您将学习如何使用静态内存数据在 D3.js 中设置简单的条形图。在这里,您将了解如何访问 JSON、CSV 和 XML 远程数据格式并将它们绑定到您的图表。数据来源于运输统计局

获取 CSV 数据

逗号分隔值 (CSV) 是一种共享数据的常用格式,因为它简单易懂。要开始获取远程 CSV 数据,请启动 React 应用并将 CSV 文件放在/public文件夹中以在本地提供它。为此,请运行:

      yarn start
    

然后创建文件public/chart-data.csv并粘贴以下内容。

      year,efficiency,sales
1980,24.3,8949000
1985,27.6,10979000
1990,28,9303000
1991,28.4,8185000
1992,27.9,8213000
1993,28.4,8518000
1994,28.3,8991000
1995,28.6,8620000
1996,28.5,8479000
1997,28.7,8217000
1998,28.8,8085000
1999,28.3,8638000
2000,28.5,8778000
2001,28.8,8352000
2002,29,8042000
2003,29.5,7556000
2004,29.5,7483000
2005,30.3,7660000
2006,30.1,7762000
2007,31.2,7562000
2008,31.5,6769000
2009,32.9,5402000
2010,33.9,5636000
2011,33.1,6093000
2012,35.3,7245000
2013,36.4,7586000
2014,36.5,7708000
2015,37.2,7517000
2016,37.7,6873000
2017,39.4,6081000
    

您现在可以导航到 https://localhost:3000/chart-data.csv 来查看本地提供的数据。

通过提供 CSV 文件,您可以修改 React 代码并在图表中显示其数据。

将src/App.js更新为以下代码以获取 CSV 数据。

      import React from "react";
import BarChart from "./BarChart";
import * as d3 from "d3";
import "./App.css";

function App() {
  const [data, setData] = React.useState([]);
  const [loading, setLoading] = React.useState(true);

  React.useEffect(() => {
    d3.csv("/chart-data.csv").then((d) => {
      setData(d);
      setLoading(false);
    });
    return () => undefined;
  }, []);

  return (
    <div className="App">
      <header className="App-header">
        {loading && <div>loading</div>}
        {!loading && <BarChart data={data} />}
      </header>
    </div>
  );
}

export default App;
    

上面的代码片段演示了在加载App组件时获取 CSV 数据。加载组件时,默认状态为loading=true ,并向localhost:3000/chart-data.csv发出请求以获取数据。获取请求完成后,它会将应用程序的状态更新为loading=false,并显示传递检索到的数据的BarChart组件。

检索 JSON 数据

JSON 是另一种流行的数据共享格式。与 CSV 相比,它允许分层数据类型,但更冗长。要开始提供 JSON,请创建文件public/chart-data.json并添加以下内容。

      
  {"year": 1980
    

您已创建了一个 JSON 文件,其服务地址为 https://localhost:3000/chart-data.json,与 CSV 示例类似。要开始获取此数据,您只需对App.js进行少量修改。它看起来像下面的代码片段:

      import React from "react";
import BarChart from "./BarChart";
import * as d3 from "d3";
import "./App.css";

function App() {
  const [data, setData] = React.useState([]);
  const [loading, setLoading] = React.useState(true);

  React.useEffect(() => {
    d3.json("/chart-data.json").then((d) => {
      setData(d);
      setLoading(false);
    });
    return () => undefined;
  }, []);

  return (
    <div className="App">
      <header className="App-header">
        {loading && <div>loading</div>}
        {!loading && <BarChart data={data} />}
      </header>
    </div>
  );
}

export default App;
    

请注意,您仅将 URL 更改为/chart-data.json并将函数调用从d3.csv更改为d3.json

获取 XML 数据

另一种常见的数据格式是 XML。这种格式可能比较冗长,因此不适用于新开发,在较旧的遗留系统中更常用。要提供这种格式,请创建文件public/chart-data.xml并添加以下内容。

      <?xml version="1.0" encoding="UTF-8"?>
<root>
   <element>
      <efficiency>24.3</efficiency>
      <sales>8949000</sales>
      <year>1980</year>
   </element>
   <element>
      <efficiency>27.6</efficiency>
      <sales>10979000</sales>
      <year>1985</year>
   </element>
   <element>
      <efficiency>28</efficiency>
      <sales>9303000</sales>
      <year>1990</year>
   </element>
   <element>
      <efficiency>28.4</efficiency>
      <sales>8185000</sales>
      <year>1991</year>
   </element>
   <element>
      <efficiency>27.9</efficiency>
      <sales>8213000</sales>
      <year>1992</year>
   </element>
   <element>
      <efficiency>28.4</efficiency>
      <sales>8518000</sales>
      <year>1993</year>
   </element>
   <element>
      <efficiency>28.3</efficiency>
      <sales>8991000</sales>
      <year>1994</year>
   </element>
   <element>
      <efficiency>28.6</efficiency>
      <sales>8620000</sales>
      <year>1995</year>
   </element>
   <element>
      <efficiency>28.5</efficiency>
      <sales>8479000</sales>
      <year>1996</year>
   </element>
   <element>
      <efficiency>28.7</efficiency>
      <sales>8217000</sales>
      <year>1997</year>
   </element>
   <element>
      <efficiency>28.8</efficiency>
      <sales>8085000</sales>
      <year>1998</year>
   </element>
   <element>
      <efficiency>28.3</efficiency>
      <sales>8638000</sales>
      <year>1999</year>
   </element>
   <element>
      <efficiency>28.5</efficiency>
      <sales>8778000</sales>
      <year>2000</year>
   </element>
   <element>
      <efficiency>28.8</efficiency>
      <sales>8352000</sales>
      <year>2001</year>
   </element>
   <element>
      <efficiency>29</efficiency>
      <sales>8042000</sales>
      <year>2002</year>
   </element>
   <element>
      <efficiency>29.5</efficiency>
      <sales>7556000</sales>
      <year>2003</year>
   </element>
   <element>
      <efficiency>29.5</efficiency>
      <sales>7483000</sales>
      <year>2004</year>
   </element>
   <element>
      <efficiency>30.3</efficiency>
      <sales>7660000</sales>
      <year>2005</year>
   </element>
   <element>
      <efficiency>30.1</efficiency>
      <sales>7762000</sales>
      <year>2006</year>
   </element>
   <element>
      <efficiency>31.2</efficiency>
      <sales>7562000</sales>
      <year>2007</year>
   </element>
   <element>
      <efficiency>31.5</efficiency>
      <sales>6769000</sales>
      <year>2008</year>
   </element>
   <element>
      <efficiency>32.9</efficiency>
      <sales>5402000</sales>
      <year>2009</year>
   </element>
   <element>
      <efficiency>33.9</efficiency>
      <sales>5636000</sales>
      <year>2010</year>
   </element>
   <element>
      <efficiency>33.1</efficiency>
      <sales>6093000</sales>
      <year>2011</year>
   </element>
   <element>
      <efficiency>35.3</efficiency>
      <sales>7245000</sales>
      <year>2012</year>
   </element>
   <element>
      <efficiency>36.4</efficiency>
      <sales>7586000</sales>
      <year>2013</year>
   </element>
   <element>
      <efficiency>36.5</efficiency>
      <sales>7708000</sales>
      <year>2014</year>
   </element>
   <element>
      <efficiency>37.2</efficiency>
      <sales>7517000</sales>
      <year>2015</year>
   </element>
   <element>
      <efficiency>37.7</efficiency>
      <sales>6873000</sales>
      <year>2016</year>
   </element>
   <element>
      <efficiency>39.4</efficiency>
      <sales>6081000</sales>
      <year>2017</year>
   </element>
</root>
    

要查询此数据,请更新App.js并将useEffect钩子更改为以下内容:

      React.useEffect(() => {
    d3.xml("/chart-data.xml").then((d) => {
      const chartData = [];
      for (const element of d.children[0].children) {
        chartData.push({
          efficiency: element.children[0].textContent,
          sales: element.children[1].textContent,
          year: element.children[2].textContent
        })
      }
      setData(chartData);
      setLoading(false);
    });
    return () => undefined;
  }, []);
    

请注意,我们已将 URL 更改为/chart-data.xml并将函数调用更改为d3.xml。此外,解析 XML 数据还需要一些额外的代码。这种解析代码样式容易出错,需要反复试验才能正确解析。最好以 JSON 或 CSV 格式检索数据,因为使用 JavaScript 更容易。

结论

从远程数据源绑定图表对于让您的网站看起来更具吸引力和动态非常重要。您已经学习了如何使用 JSON、CSV 和 XML 格式。下一步,您可能希望了解有关Fetch API 的更多信息,以执行更高级的交互,例如传递自定义标头和错误处理。

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据