如何在 React 中使用 axios 在单独的组件中只呈现一个结果?
How do I only render one result in a separate component using axios in React?
编辑//
我想我的问题不是很清楚。当我的 url 指向 http://localhost:1233/details/‘${parkcode}’ 时,我试图让一个公园归还。我已经在 results.js 文件中为 url 定义了参数。但是我无法在我的 details.js 中定义 this.setState 以根据 id 仅呈现公园的一个结果,该 id 也恰好是公园代码。
我是 React 的新手(可能 JavaScript,我不知道了)。我正在学习教程 - 我决定分支并使用 axios.get() 从 API 中获取数据,而不是使用 npm 包作为 API。我能够将组件的结果呈现到浏览器中,但是在添加 reach-router 之后(我假设它类似于 React Router),我无法将 API 调用的一个结果呈现为页面我正在尝试构建应该只根据我定义的 ID 显示一个结果。
在我的主文件中,这里是 Results.js,我可以毫无问题地获取数据并使用 JSX 将它们包含在我的文件中并呈现它们。我正在尝试使用与我在 Details.js 页面(该页面应该只向路由中的 ID 显示一个结果)中的那个页面相同的逻辑。
我如何在 Results.js
中使用 axios
componentDidMount() {
axios
.get(
"https://developer.nps.gov/api/v1/parks?stateCode=wa&fields=images&api_key=" +
`${nps}`
)
// https://css-tricks.com/using-data-in-react-with-the-fetch-api-and-axios/
.then(res =>
res.data.data.map(park => ({
description: `${park.description}`,
fullname: `${park.fullName}`,
states: `${park.states}`,
parkcode: `${park.parkCode}`,
image: `${park.images[0] ? park.images[0].url : "No Image"}`,
designation: `${park.designation}`
}))
)
.then(parks => {
this.setState({
parks
});
console.log(parks);
});
}
我如何尝试在 Details.js
中使用相同的逻辑
即使我调用了 API,它也无法识别 park.name。但是,如果我对 park[0].name 进行硬编码,它就可以工作。我不知道我在这里做错了什么。这可能是一个明显的问题,但请帮助我。
class Details extends React.Component {
constructor (props) {
super(props);
this.state = {
loading: true,
}
}
componentDidMount() {
axios
.get(
"https://developer.nps.gov/api/v1/parks?stateCode=wa&fields=images&api_key=" +
`${nps}`,
{ id: this.props.id }
).then(res => {
const park = res.data.data.map(park => ({
description: `${park.description}`,
fullname: `${park.fullName}`,
states: `${park.states}`,
parkcode: `${park.parkCode}`,
image: `${park.images[0] ? park.images[0].url : "No Image"}`,
designation: `${park.designation}`
}))
console.log(park.name);
this.setState({
name: park.name;
loading: false
})
}).catch(err => {
this.setState({error: err});
})
}
我希望页面能够识别 GET 请求中定义的 ID 以及 axios,并呈现与该 ID 相关的公园详细信息。但是现在,它正在做 none,而我一直坚持这个 :(
我相信这是你弄错的部分
const parks = res.data.data.map(park => ({
description: `${park.description}`,
fullname: `${park.fullName}`,
states: `${park.states}`,
parkcode: `${park.parkCode}`,
image: `${park.images[0] ? park.images[0].url : "No Image"}`,
designation: `${park.designation}`
}))
console.log(parks) // this should display your array of all parks
this.setState({
parks,
loading: false
})
displayParks(parks) {
const allParks = parks.map((park, index) => {
return <div key={park.parkCode}>{park.fullname}<div>
})
}
render() {
const { parks } = this.state;
const displayParks = parks && parks.length > 0 ? this.displayParks(parks) : <div>Loading parks</div>
return (
<div>{ displayParks }</div>
);
}
当您在一个数组上执行 .map 时,您基本上是在创建另一个数组,这就是返回给您的 park
变量的内容。
因此在您的渲染方法中,您可以循环遍历 parks
中的每个项目
您可以在 .then()
试试这个
let park = res.data.data.map(park => ({
description: `${park.description}`,
fullname: `${park.fullName}`,
states: `${park.states}`,
parkcode: `${park.parkCode}`,
image: `${park.images[0] ? park.images[0].url : "No Image"}`,
designation: `${park.designation}`
}))
park = park[0]; // convert arrays of parks to single park
console.log(park.fullname); // now you can use `park.fullname`
或者这个
const park = {
description: `${res.data.data[0].description}`,
fullname: `${res.data.data[0].fullName}`,
states: `${res.data.data[0].states}`,
parkcode: `${res.data.data[0].parkCode}`,
image: `${res.data.data[0].images[0] ? park.images[0].url : "No Image"}`,
designation: `${res.data.data[0].designation}`
}
console.log(park.fullname); // now you can use `park.fullname`
否则在API
我想你可以先为你的回复设置一个状态,然后尝试显示它们
同样的:
state = {
result: []
}
componentDidMount() {
axios
.get("https://developer.nps.gov/api/v1/parks?stateCode=wa&fields=images&api_key=" +`${nps}`).then((res) => {
this.setState({result: res.data.data})
})
}
render(){
const result = this.state.result.map((el, index) => {
return(
//data
)
})
return(
<div>
{result}
</div>
)
}
您的代码中有一些不必要的部分。您不需要像在 setState
部分中那样构建数据。您正在获取公园列表,它已经是结构化数据。因此,只需使用返回的数据设置状态即可。
之后,您可以映射此数据并使用 React Router 的链接渲染公园。您可以使用 parkCode
作为 Link
的 URL 参数。在 Details
组件中,您可以提取此 parkCode
并提出新的公园详细信息请求,然后将其设置为您所在的州。
我提供了一个例子。
index.js
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import Results from "./Results";
import Details from "./Details";
const Routes = () => (
<Router>
<Switch>
<Route exact path="/" component={Results} />
<Route path="/details/:parkCode" component={Details} />
</Switch>
</Router>
);
ReactDOM.render(<Routes />, document.getElementById("root"));
结果
import React from "react";
import axios from "axios";
import { Link } from "react-router-dom";
class Results extends React.Component {
state = {
parks: [],
loading: true,
};
componentDidMount() {
axios(
"https://developer.nps.gov/api/v1/parks?stateCode=wa&fields=images&api_key=LbqZVj21QMimfJyAHbPAWabFaBmfaTZtseq5Yc6t"
).then(res => this.setState({ parks: res.data.data, loading: false }));
}
renderParks = () =>
this.state.parks.map(park => (
<Link to={`/details/${park.parkCode}`} key={park.parkCode}>
<div>{park.fullName}</div>
</Link>
));
render() {
return (
<div>{this.state.loading ? <p>Loading...</p> : this.renderParks()}</div>
);
}
}
export default Results;
详情
import React from "react";
import axios from "axios";
class Details extends React.Component {
state = { park: "", loading: true };
componentDidMount() {
const { match } = this.props;
axios(
`https://developer.nps.gov/api/v1/parks?parkCode=${match.params.parkCode}&api_key=${nps}`
).then(res => this.setState({ park: res.data.data[0], loading: false }));
}
render() {
return (
<div>
{this.state.loading ? <p>Loading...</p> : this.state.park.description}
</div>
);
}
}
export default Details;
编辑//
我想我的问题不是很清楚。当我的 url 指向 http://localhost:1233/details/‘${parkcode}’ 时,我试图让一个公园归还。我已经在 results.js 文件中为 url 定义了参数。但是我无法在我的 details.js 中定义 this.setState 以根据 id 仅呈现公园的一个结果,该 id 也恰好是公园代码。
我是 React 的新手(可能 JavaScript,我不知道了)。我正在学习教程 - 我决定分支并使用 axios.get() 从 API 中获取数据,而不是使用 npm 包作为 API。我能够将组件的结果呈现到浏览器中,但是在添加 reach-router 之后(我假设它类似于 React Router),我无法将 API 调用的一个结果呈现为页面我正在尝试构建应该只根据我定义的 ID 显示一个结果。
在我的主文件中,这里是 Results.js,我可以毫无问题地获取数据并使用 JSX 将它们包含在我的文件中并呈现它们。我正在尝试使用与我在 Details.js 页面(该页面应该只向路由中的 ID 显示一个结果)中的那个页面相同的逻辑。
我如何在 Results.js
中使用 axioscomponentDidMount() {
axios
.get(
"https://developer.nps.gov/api/v1/parks?stateCode=wa&fields=images&api_key=" +
`${nps}`
)
// https://css-tricks.com/using-data-in-react-with-the-fetch-api-and-axios/
.then(res =>
res.data.data.map(park => ({
description: `${park.description}`,
fullname: `${park.fullName}`,
states: `${park.states}`,
parkcode: `${park.parkCode}`,
image: `${park.images[0] ? park.images[0].url : "No Image"}`,
designation: `${park.designation}`
}))
)
.then(parks => {
this.setState({
parks
});
console.log(parks);
});
}
我如何尝试在 Details.js
中使用相同的逻辑即使我调用了 API,它也无法识别 park.name。但是,如果我对 park[0].name 进行硬编码,它就可以工作。我不知道我在这里做错了什么。这可能是一个明显的问题,但请帮助我。
class Details extends React.Component {
constructor (props) {
super(props);
this.state = {
loading: true,
}
}
componentDidMount() {
axios
.get(
"https://developer.nps.gov/api/v1/parks?stateCode=wa&fields=images&api_key=" +
`${nps}`,
{ id: this.props.id }
).then(res => {
const park = res.data.data.map(park => ({
description: `${park.description}`,
fullname: `${park.fullName}`,
states: `${park.states}`,
parkcode: `${park.parkCode}`,
image: `${park.images[0] ? park.images[0].url : "No Image"}`,
designation: `${park.designation}`
}))
console.log(park.name);
this.setState({
name: park.name;
loading: false
})
}).catch(err => {
this.setState({error: err});
})
}
我希望页面能够识别 GET 请求中定义的 ID 以及 axios,并呈现与该 ID 相关的公园详细信息。但是现在,它正在做 none,而我一直坚持这个 :(
我相信这是你弄错的部分
const parks = res.data.data.map(park => ({
description: `${park.description}`,
fullname: `${park.fullName}`,
states: `${park.states}`,
parkcode: `${park.parkCode}`,
image: `${park.images[0] ? park.images[0].url : "No Image"}`,
designation: `${park.designation}`
}))
console.log(parks) // this should display your array of all parks
this.setState({
parks,
loading: false
})
displayParks(parks) {
const allParks = parks.map((park, index) => {
return <div key={park.parkCode}>{park.fullname}<div>
})
}
render() {
const { parks } = this.state;
const displayParks = parks && parks.length > 0 ? this.displayParks(parks) : <div>Loading parks</div>
return (
<div>{ displayParks }</div>
);
}
当您在一个数组上执行 .map 时,您基本上是在创建另一个数组,这就是返回给您的 park
变量的内容。
因此在您的渲染方法中,您可以循环遍历 parks
您可以在 .then()
let park = res.data.data.map(park => ({
description: `${park.description}`,
fullname: `${park.fullName}`,
states: `${park.states}`,
parkcode: `${park.parkCode}`,
image: `${park.images[0] ? park.images[0].url : "No Image"}`,
designation: `${park.designation}`
}))
park = park[0]; // convert arrays of parks to single park
console.log(park.fullname); // now you can use `park.fullname`
或者这个
const park = {
description: `${res.data.data[0].description}`,
fullname: `${res.data.data[0].fullName}`,
states: `${res.data.data[0].states}`,
parkcode: `${res.data.data[0].parkCode}`,
image: `${res.data.data[0].images[0] ? park.images[0].url : "No Image"}`,
designation: `${res.data.data[0].designation}`
}
console.log(park.fullname); // now you can use `park.fullname`
否则在API
我想你可以先为你的回复设置一个状态,然后尝试显示它们
同样的:
state = {
result: []
}
componentDidMount() {
axios
.get("https://developer.nps.gov/api/v1/parks?stateCode=wa&fields=images&api_key=" +`${nps}`).then((res) => {
this.setState({result: res.data.data})
})
}
render(){
const result = this.state.result.map((el, index) => {
return(
//data
)
})
return(
<div>
{result}
</div>
)
}
您的代码中有一些不必要的部分。您不需要像在 setState
部分中那样构建数据。您正在获取公园列表,它已经是结构化数据。因此,只需使用返回的数据设置状态即可。
之后,您可以映射此数据并使用 React Router 的链接渲染公园。您可以使用 parkCode
作为 Link
的 URL 参数。在 Details
组件中,您可以提取此 parkCode
并提出新的公园详细信息请求,然后将其设置为您所在的州。
我提供了一个例子。
index.js
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import Results from "./Results";
import Details from "./Details";
const Routes = () => (
<Router>
<Switch>
<Route exact path="/" component={Results} />
<Route path="/details/:parkCode" component={Details} />
</Switch>
</Router>
);
ReactDOM.render(<Routes />, document.getElementById("root"));
结果
import React from "react";
import axios from "axios";
import { Link } from "react-router-dom";
class Results extends React.Component {
state = {
parks: [],
loading: true,
};
componentDidMount() {
axios(
"https://developer.nps.gov/api/v1/parks?stateCode=wa&fields=images&api_key=LbqZVj21QMimfJyAHbPAWabFaBmfaTZtseq5Yc6t"
).then(res => this.setState({ parks: res.data.data, loading: false }));
}
renderParks = () =>
this.state.parks.map(park => (
<Link to={`/details/${park.parkCode}`} key={park.parkCode}>
<div>{park.fullName}</div>
</Link>
));
render() {
return (
<div>{this.state.loading ? <p>Loading...</p> : this.renderParks()}</div>
);
}
}
export default Results;
详情
import React from "react";
import axios from "axios";
class Details extends React.Component {
state = { park: "", loading: true };
componentDidMount() {
const { match } = this.props;
axios(
`https://developer.nps.gov/api/v1/parks?parkCode=${match.params.parkCode}&api_key=${nps}`
).then(res => this.setState({ park: res.data.data[0], loading: false }));
}
render() {
return (
<div>
{this.state.loading ? <p>Loading...</p> : this.state.park.description}
</div>
);
}
}
export default Details;