在React中使用Recharts来添加图表

1,622 阅读7分钟

如今,可视化是必不可少的,你如何呈现信息很重要。随着我们指尖上的数据越来越多,这些数据往往会让人感到乏味,尤其是在没有得到很好的呈现时。

为了使数据更容易消化,图表是组织和可视化数据的一个好方法。对于React应用,开发者可以使用Recharts,这是一个基于JavaScript的开源 "基于React组件的可组合图表库"。

在本教程中,我们将通过构建一个小型React应用来学习如何使用Recharts,该应用从Sanity内容湖中获取数据,以视觉上吸引人的方式总结大量数据集。

Recharts教程的要求

要跟上本教程,你必须具备以下条件。

  • 在你的电脑上安装Node.js v14
  • 一个代码编辑器(我使用的是Visual Studio Code)。
  • Yarn软件包管理器

设置Recharts项目

为了开始我们的项目,我们必须首先在我们的机器上安装Sanity CLI,这可以通过运行以下命令来完成。

yarn install -g @sanity/cli

这将在全局范围内安装命令行工具,以设置新项目、管理数据集、导入数据等。我们将用它来启动和运行我们的项目。

创建一个Sanity项目

接下来,我们必须启动我们的Sanity项目。要做到这一点,运行下面的命令。

sanity init

上面的命令会要求你选择你的登录类型:Google,GitHub,Email/password

Selecting Login Type

你可以选择一个对你的项目来说最方便的,这将立即打开你的默认浏览器并完成注册/登录过程。

Login Successful Screen

回到你的终端,你会被提示到。

  • 导入你的首选项目名称
  • 选择一个数据集的偏好(使用默认的)。
  • 确认项目的路径
  • 选择一个模式

在发布这篇文章时,Sanity只提供了三种开箱即用的、已经填充好的模式:Movie project (schema + sample data)E-commerce (Schema + sample data)Blog(schema + empty data)

然而,对于这个项目,我们必须选择Clean project with no predefined schemas ,因为我们必须自己定义我们的模式。

Defining Schemas in VS Code

安装完成后,我们可以看到在我们的项目文件夹中创建的文件和文件夹。要启动Sanity,请运行以下命令。

sanity start

Starting Sanity in VS Code

接下来,我们必须安装必要的节点模块,进行编译,并在http://localhost:3333,启动项目。在登录的时候,确保你选择的是你在创建项目时使用的同一个提供者。

Logging In To Install Modules For Sanity

现在,让我们添加我们的模式代码;这只是内容建模,即识别、整理并将所有内容关联到一个集中的结构中的过程,这样我们就可以建立高效的工作流和数据结构。

Adding Schema Code To Empty Schema In Sanity

我们在这个项目中要使用的数据来自John Hopkins的GitHub页面,它提供了Covid病例的每日报告,包括我们感兴趣的字段:省/州,确诊病例,以及死亡人数。

我们将特别使用01/01/2021的数据在我们的图表中表示。要做到这一点,首先,在schemas 文件夹中创建一个文件,名为covid.js ,并复制和粘贴以下代码。

这个文件定义了特定模式的结构。

// schemas/covid.js

export default{
    name: "covid",
    type : "document",
    title: "Covid19Data",
    fields: [
      {
      name: "title",
      type: "string",
      title: "States"
      },
      {
        name: "confirmed",
        type: "number",
        title: "Confirmed"
      },
        {
          name: "death",
          type: "number",
          title: "Death"
          },
    ],
  }

现在,我们必须将covid.js 导入我们的schemas 文件夹内的schema.js 文件,像这样。

// schemas/schema.js
// First, we must import the schema creator
import createSchema from 'part:@sanity/base/schema-creator'
// Then import schema types from any plugins that might expose them
import schemaTypes from 'all:part:@sanity/base/schema-type'
import covid from './covid'
// Then we give our schema to the builder and provide the result to Sanity
export default createSchema({
  // We name our schema
  name: 'default',
  // Then proceed to concatenate our document type
  // to the ones provided by any plugins that are installed
  types: schemaTypes.concat([
    /* Your types here! */
    covid,

  ]),
}

现在,回到http://localhost:3333,我们会看到这个。

Covid19 Document Created In The Sanity Schema

Covid19Data 是我们在模式中创建的文件的标题,其中有States,Confirmed, 和Death

States 展示了Covid病例的地点,Confirmed 显示了Covid检测呈阳性的人数,Death 显示了在该特定州死于Covid的人数。

我们现在可以用01/01/2021数据集的数据来填充我们的项目。

image.png

注意,我们必须只从下面的Province_State,Confirmed, 和Deaths 列中复制。

Copying Covid19 Data

创建一个React应用程序

现在我们的Sanity项目已经启动并运行,现在是时候用React设置我们的前端应用程序了。

首先,创建一个空的文件夹并运行这个命令。

npx create-react-app frontendfinal

frontendfinal 是我决定的项目名称,但记住,你的项目可以是任何名字。

安装完React后,是时候安装Recharts了。首先,cdfrontendfinal

cd frontendfinal

然后,我们可以安装recharts

npm install recharts

在你的文本编辑器中打开它,并导航到package.json ,这样就可以打开以下内容。

Opening Package.json In VS Code

现在,Recharts已经安装在我们的React应用中了

清理React代码

create react app 命令可以快速引导React应用程序;现在,我们只需要对其进行一些修改,以适应我们的用例,因为我们不需要create react app 自带的一切。

对于这个特殊的用例,我们不需要在src 文件夹内使用App.csslogo.svg ;只需删除App.js 内的所有代码。

安装Sanity客户端

为了让你的React应用程序连接到正在运行的Sanity实例,你必须安装[sanity/client](https://www.npmjs.com/package/@sanity/client)通过运行此命令。

npm install --save @sanity/client

接下来,在src 文件夹中创建一个文件。我决定使用clientDetail.js ,所以在clientDetail.js 内,复制并粘贴以下代码,并适当地替换细节。

// src/clientDetails.js
const sanityClient = require('@sanity/client')
const client = sanityClient({
  projectId: 'xxxxxxx',
  dataset: 'production',
  apiVersion: '2021-03-25', // use a UTC date string
  useCdn: false, // `false` if you want to ensure fresh data
})
export default client;

你可以通过登录到你的Sanity账户并选择你的项目来获得你的projectId 。其他信息如数据集也在那里。

Getting The Project ID From Sanity

同样,为了避免CORS问题,Sanity让你添加请求的来源。要添加一个新的原点,请按照以下步骤进行。

  • 设置>API设置>CORS原点
  • 点击ADD CORS origin并添加http://localhost:3000,这是你的 React URL
  • 当部署这个应用程序时,添加你的应用程序URL
  • 勾选Allow Credential>Save

这些步骤已经在下面的截图中进行了直观的编号。

Adding Request Origin In Sanity To Avoid CORS Issues

回到我们的App.js 文件中,我们必须导入以下内容。useState, useEffect 来自reactclient 来自clientDetails.js 文件,并从Recharts导入一些组件(LineChartLineXAxisYAxisCartesianGridTooltipLegend )来表示数据。

我们的App.js 文件将看起来像这样。

// src/App.js
import React, { useState, useEffect } from "react";
import client from "./clientDetails";
import {
  LineChart,
  Line,
  XAxis,
  YAxis,
  CartesianGrid,
  Tooltip,
  Legend,
} from "recharts";

然后,我们可以创建一个名为App 的功能组件,它将使用useState,useEffect,并使用GROQ从我们的Sanity实例中获取数据

// src/App.js
import React, { useState, useEffect } from "react";
import client from "./clientDetails";
import {
  LineChart,
  Line,
  XAxis,
  YAxis,
  CartesianGrid,
  Tooltip,
  Legend,
} from "recharts";
export default function App() {
  const [covidData, setcovidData] = useState(null);
  useEffect(() => {
    client
      .fetch(
        `*[_type == 'covid']{
      confirmed,
      title,
      death
      }`
      )
      .then((data) => {
        setcovidData(data);
      })
      .catch(console.error);
  }, []);

然后我们必须返回一个div 标签,其中包含所有导入的Recharts组件和一些定义的属性。

我们的App.js 完整代码应该如下。

// src/App.js
import React, { useState, useEffect } from "react";
import client from "./clientDetails";
import {
  LineChart,
  Line,
  XAxis,
  YAxis,
  CartesianGrid,
  Tooltip,
  Legend,
} from "recharts";
export default function App() {
  const [covidData, setcovidData] = useState(null);
  useEffect(() => {
    client
      .fetch(
        `*[_type == 'covid']{
      confirmed,
      title,
      death
      }`
      )
      .then((data) => {
        setcovidData(data);
      })
      .catch(console.error);
  }, []);
  return (
    <div>
      {!covidData && <div>Loading</div>}
      {covidData && (
        <LineChart
          width={1000}
          height={400}
          data={covidData}
          margin={{
            top: 10,
            right: 30,
            left: 0,
            bottom: 0,
          }}
        >

          <CartesianGrid strokeDasharray="3 3" />
          <XAxis dataKey="title" />
          <YAxis />
          <Tooltip />
          <Legend />
          <Line
            type="monotone"
            dataKey="death"
            stroke="#8884d8"
            fill="#8884d8"
          />
           <Line
            type="monotone"
            dataKey="confirmed"
            stroke="#8884d8"
            fill="#8884d8"
          />
        </LineChart>
      )}
    </div>
  );
}

为了运行我们最终确定的代码,我们可以用以下方式运行我们的React应用程序。

npm run start

然后,我们可以在http://localhost:3000/,将其启动。

Final Recharts Graph Showing States And Corresponding Covid Data

祝贺你,你能够看透这一点!

结论

可视化是组织数据的必要条件,最重要的是我们要聪明地、简明地展示它。我们能够从Sanity获取数据到我们的React应用程序,并使用Recharts显示它。