通过外部 API 将数据访问到 React 组件中
介绍
从外部 API 获取数据并使用该数据渲染 React 组件是构建 React 应用的常见任务。在本指南中,您将学习如何从 GitHub 用户 API 获取 JSON 数据并在 React 组件内渲染该数据。这将帮助您发出由浏览器发起的异步请求(包括跨网络的请求)来获取资源。
方法
您可以使用两种方法从网络获取数据。
- Fetch,一种可在浏览器中获取网络资源的 Web API。
- Axios,一个基于Promise的浏览器和 node.js npm库。
您将从 GitHub 用户 API 中获取特定用户名的数据,并呈现一个 React 组件来显示用户的详细信息,包括该用户的姓名、位置、博客 URL 和公司名称。
设置 React App
第一步是设置 React 应用。打开终端并运行以下命令,以在您的机器上运行示例 Create React App (CRA)。
npx create-react-app access-api-react
cd access-api-react
yarn start
这将以开发模式启动您的应用。要检查示例应用是否正在运行,请在浏览器中打开https://localhost:3000 。您应该会看到一个 React 徽标。
返回到您的终端并在项目根目录中添加axios的npm依赖项。您将需要此库来向 GitHub API 发送请求。
yarn add axios
修改应用程序组件
在您最喜欢的编辑器中打开项目,并从<App>组件中删除所有样板代码。您将在src/目录中找到该文件。在您的组件中添加以下代码。
import React, { useState, useEffect } from "react";
import "./App.css";
const gitHubUrl = "https://api.github.com/users/deekshasharma";
function App() {
const [userData, setUserData] = useState({});
useEffect(() => {
getGitHubUserWithFetch();
}, []);
const getGitHubUserWithFetch = async () => {};
return (
<div className="App">
<header className="App-header">
<h2>GitHub User Data</h2>
</header>
<div className="user-container">
<h5 className="info-item">{userData.name}</h5>
<h5 className="info-item">{userData.location}</h5>
<h5 className="info-item">{userData.blog}</h5>
<h5 className="info-item">{userData.company}</h5>
</div>
</div>
);
}
export default App;
在上面的代码中,gitHubUrl是一个变量,其中包含用户名deekshasharma的 GitHub API URL 。它被声明为const,因为这个值不会改变。
下面的 State Hook 将允许在<App>函数组件中使用状态,而无需编写单独的类组件。userData是一个最初为空的对象(useState({}))。一旦从网络获取数据,它将包含用户数据(姓名、位置、博客和公司)。setUserData相当于编写this.setState()以使用userData的值更新组件状态。
const [userData, setUserData] = useState({});
接下来是 Effect Hook,它允许您执行副作用操作,例如获取数据、清理或 DOM 操作。useEffect()将一个函数作为参数,该函数将在第一次渲染后和每次组件更新后执行。因此,此函数是调用getGitHubUserWithFetch()函数的合适位置,该函数的作用是从 GitHub API 获取用户数据并更新组件。将第二个参数传递给useEffect是可选的。传递一个空数组[]可确保此效果只运行一次;否则,它将在每次渲染后运行。
useEffect(() => {
getGitHubUserWithFetch();
}, []);
getGitHubUserWithFetch()是一个没有实现的异步函数。我们很快就会在这个函数里写代码。
最后,<App>组件返回一个标题,其中包含文本“GitHub User Data”和在<div>元素内呈现的用户数据(姓名、位置、博客和公司)。
return (
<div className="App">
<header className="App-header">
<h2>GitHub User Data</h2>
</header>
<div className="user-container">
<h5 className="info-item">{userData.name}</h5>
<h5 className="info-item">{userData.location}</h5>
<h5 className="info-item">{userData.blog}</h5>
<h5 className="info-item">{userData.company}</h5>
</div>
</div>
);
将src/App.css中的内容替换为以下代码。现有样式略有更改,并添加新样式以在网页上显示用户数据。
.App {
text-align: center;
}
.App-header {
background-color: #282c34;
min-height: 10vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.user-container {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.info-item {
width: 15vw;
height: 5vh;
padding: 2em;
border: 2px solid rgb(159, 12, 22);
align-self: center;
background-color: #63b7af;
border-radius: 2em;
}
使用 Fetch API 获取数据
以下是如何实现getGitHubUserWithFetch()函数。下面的代码使用async/await,以便异步代码可读且看起来像是同步执行。
虽然异步函数总是返回一个Promise,但在这种情况下不需要返回值,因为setUserData()是在函数本身中使用生成的jsonData进行调用的。
现在出现了fetch() API,它将 URL 作为参数,向该 URL 发出网络请求,并返回解析为响应对象的Promise。
fetch()函数前面的await关键字会暂停代码,直到fetch()返回已实现的Promise,之后它返回已解析的值response。
然后使用json()方法将响应解析为 JSON ,该方法还返回一个解析为 JSON 对象jsonData的Promise。使用await再次暂停代码,直到响应解析为 JSON。然后使用生成的 JSON 对象jsonData调用setUserData() 。它使用 GitHub 用户数据更新<App>组件的状态。
const getGitHubUserWithFetch = async () => {
const response = await fetch(gitHubUrl);
const jsonData = await response.json();
setUserData(jsonData);
};
要验证代码更改,请打开浏览器访问https://localhost:3000,您应该能够查看以用户名deekshasharma的 React 组件形式呈现的 GitHub 用户详细信息。
使用 Axios 获取数据
从 GitHub API 获取数据的第二种方法是使用 Axios 库。您已经在项目中安装了依赖项。现在您需要做的就是将其导入src/App.js中。因此,继续添加此导入。
import axios from "axios";
在您的<App>组件中添加另一个使用 Axios 的函数 getGiHubUserWithAxios() 。由于它是一个基于Promise的库,因此您可以无缝地用async/await替换Promise.then()。
该库的get()方法将 URL 作为参数,并向该 URL 发出http请求。然后,它会自动将响应转换为 JSON,您可以从其data属性中获取该 JSON。一旦收到数据,组件的状态就会通过setUserData()函数更新。
const getGiHubUserWithAxios = async () => {
const response = await axios.get(gitHubUrl);
setUserData(response.data);
};
在您的<App>组件内,确保在useEffect()<font style="vert
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~