admin管理员组文章数量:1023758
I need to parse Rest API resposnes with JSON. But when I use AXIOS in functional poment it returns first empty array and then exact api response.data / after render. So return functions returns empty array but in the fact the data is there but after rendering
The api response
{
"eventId": "3c6a12e3-ac96-4f9d-9d26-7c7a6c730198",
"organizerId": "23a41cd1-e60e-41ff-b5d3-13815ed9b3a9",
"eventDate": "2021-11-28T14:14:16.191167",
"eventPlayerLimit": 10,
"eventFee": 0.0,
"playerSubscriptions": [
{
"subscriptionId": "2616720f-7106-429e-89f6-97be51dfbaf6",
"subscriptionPaymentDone": "true",
"subscriptionDate": "2021-11-28T14:14:16.217146",
"subscriptionApproved": "true",
"eventTitle": "Title",
"eventDate": "2021-11-28T14:14:16.191167",
"playerId": "a04d3ca2-af3d-4655-9eaf-6a892efe2dab",
"playerEmail": "[email protected]"
}
],
"title": "Title"
}
And the ponent body
import React, {Component, useEffect, useState} from "react";
import {Card, Button, Table} from "react-bootstrap";
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faCoffee } from '@fortawesome/free-solid-svg-icons'
import axios from "axios";
import {useParams} from "react-router-dom";
function EventsDetails () {
const [eventDetails, setEventDetails] = useState([])
let {id} = useParams();
function getEvents() {
axios.get("http://localhost:8080/api/events/"+id)
.then(response => response.data)
.then((data) => {
setEventDetails(data)
});
}
useEffect(()=>{
getEvents();
},[])
console.log(id);
console.log(eventDetails);
return (
<Card className={"border border-dark bg-dark text-white"}>
<Card.Header><FontAwesomeIcon icon={faCoffee} /> Events</Card.Header>
<Card.Body>
<Table bordered hover striped variant="dark">
<thead>
<tr align="center">
<th>Event Date</th>
<th>Event title</th>
<th>Localization</th>
<th>Payment Fee</th>
<th>Subscribed users</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{eventDetails.length === 0 ?
<tr align="center">
<td colSpan="6">No events available</td>
</tr> :
<tr align="center">
<td colSpan="6">{eventDetails.length}</td>
</tr>
}
</tbody>
</Table>
</Card.Body>
</Card>
)
}export default EventsDetails
Console log
I need to parse Rest API resposnes with JSON. But when I use AXIOS in functional poment it returns first empty array and then exact api response.data / after render. So return functions returns empty array but in the fact the data is there but after rendering
The api response
{
"eventId": "3c6a12e3-ac96-4f9d-9d26-7c7a6c730198",
"organizerId": "23a41cd1-e60e-41ff-b5d3-13815ed9b3a9",
"eventDate": "2021-11-28T14:14:16.191167",
"eventPlayerLimit": 10,
"eventFee": 0.0,
"playerSubscriptions": [
{
"subscriptionId": "2616720f-7106-429e-89f6-97be51dfbaf6",
"subscriptionPaymentDone": "true",
"subscriptionDate": "2021-11-28T14:14:16.217146",
"subscriptionApproved": "true",
"eventTitle": "Title",
"eventDate": "2021-11-28T14:14:16.191167",
"playerId": "a04d3ca2-af3d-4655-9eaf-6a892efe2dab",
"playerEmail": "[email protected]"
}
],
"title": "Title"
}
And the ponent body
import React, {Component, useEffect, useState} from "react";
import {Card, Button, Table} from "react-bootstrap";
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faCoffee } from '@fortawesome/free-solid-svg-icons'
import axios from "axios";
import {useParams} from "react-router-dom";
function EventsDetails () {
const [eventDetails, setEventDetails] = useState([])
let {id} = useParams();
function getEvents() {
axios.get("http://localhost:8080/api/events/"+id)
.then(response => response.data)
.then((data) => {
setEventDetails(data)
});
}
useEffect(()=>{
getEvents();
},[])
console.log(id);
console.log(eventDetails);
return (
<Card className={"border border-dark bg-dark text-white"}>
<Card.Header><FontAwesomeIcon icon={faCoffee} /> Events</Card.Header>
<Card.Body>
<Table bordered hover striped variant="dark">
<thead>
<tr align="center">
<th>Event Date</th>
<th>Event title</th>
<th>Localization</th>
<th>Payment Fee</th>
<th>Subscribed users</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{eventDetails.length === 0 ?
<tr align="center">
<td colSpan="6">No events available</td>
</tr> :
<tr align="center">
<td colSpan="6">{eventDetails.length}</td>
</tr>
}
</tbody>
</Table>
</Card.Body>
</Card>
)
}export default EventsDetails
Console log
Share Improve this question asked Nov 28, 2021 at 20:23 JustMJustM 1281 gold badge4 silver badges10 bronze badges 2- What is your question? This is expected behavior: the request is asynchronous and doesn't block the ponent render – Nick Commented Nov 28, 2021 at 20:27
- 1 when you call an api the data are not available until the http request is fulfilled. For this reason there is a moment in which data are not available (first render). When data e from the API call another render is done with the eventDetail state filled in with the response. – Antonio Pantano Commented Nov 28, 2021 at 20:29
3 Answers
Reset to default 1That is the expected behavior. Your first console.log
is being executed before the state update. The function is not returning an empty array, you're seeing the default state from const [eventDetails, setEventDetails] = useState([])
being logged.
Initially on the page load... you dont have data because API takes some moment before it respond with data and meanwhile your ponent already rendered with empty array i.e no data...
at some moment later the API es back with data and update the state but you've already seen a ponent without required data...
So a way around it is
You put a ponent/content/loader to be shown while you're waiting for API to give you data to be shown... and when that data es you take back the loader ponent and show that data from API
With codes it could be something as below
import React, {Component, useEffect, useState} from "react";
import {Card, Button, Table} from "react-bootstrap";
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faCoffee } from '@fortawesome/free-solid-svg-icons'
import axios from "axios";
import {useParams} from "react-router-dom";
function EventsDetails () {
const [eventDetails, setEventDetails] = useState([])
const [isLoading, setIsLoading] = useState(false);
let {id} = useParams();
function getEvents() {
setIsLoading(true);
axios.get("http://localhost:8080/api/events/"+id)
.then(response => response.data)
.then((data) => {
setEventDetails(data)
setIsLoading(false);
});
}
useEffect(()=>{
getEvents();
},[])
....//removed for brevity
return <>{isLoading ? <DisplayLoader /> : <DisplayData />}</>
Thanks guys. Sometimes I have undefined errors. Now I understand why. My function is called on every render. So I added Loader
I need to parse Rest API resposnes with JSON. But when I use AXIOS in functional poment it returns first empty array and then exact api response.data / after render. So return functions returns empty array but in the fact the data is there but after rendering
The api response
{
"eventId": "3c6a12e3-ac96-4f9d-9d26-7c7a6c730198",
"organizerId": "23a41cd1-e60e-41ff-b5d3-13815ed9b3a9",
"eventDate": "2021-11-28T14:14:16.191167",
"eventPlayerLimit": 10,
"eventFee": 0.0,
"playerSubscriptions": [
{
"subscriptionId": "2616720f-7106-429e-89f6-97be51dfbaf6",
"subscriptionPaymentDone": "true",
"subscriptionDate": "2021-11-28T14:14:16.217146",
"subscriptionApproved": "true",
"eventTitle": "Title",
"eventDate": "2021-11-28T14:14:16.191167",
"playerId": "a04d3ca2-af3d-4655-9eaf-6a892efe2dab",
"playerEmail": "[email protected]"
}
],
"title": "Title"
}
And the ponent body
import React, {Component, useEffect, useState} from "react";
import {Card, Button, Table} from "react-bootstrap";
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faCoffee } from '@fortawesome/free-solid-svg-icons'
import axios from "axios";
import {useParams} from "react-router-dom";
function EventsDetails () {
const [eventDetails, setEventDetails] = useState([])
let {id} = useParams();
function getEvents() {
axios.get("http://localhost:8080/api/events/"+id)
.then(response => response.data)
.then((data) => {
setEventDetails(data)
});
}
useEffect(()=>{
getEvents();
},[])
console.log(id);
console.log(eventDetails);
return (
<Card className={"border border-dark bg-dark text-white"}>
<Card.Header><FontAwesomeIcon icon={faCoffee} /> Events</Card.Header>
<Card.Body>
<Table bordered hover striped variant="dark">
<thead>
<tr align="center">
<th>Event Date</th>
<th>Event title</th>
<th>Localization</th>
<th>Payment Fee</th>
<th>Subscribed users</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{eventDetails.length === 0 ?
<tr align="center">
<td colSpan="6">No events available</td>
</tr> :
<tr align="center">
<td colSpan="6">{eventDetails.length}</td>
</tr>
}
</tbody>
</Table>
</Card.Body>
</Card>
)
}export default EventsDetails
Console log
I need to parse Rest API resposnes with JSON. But when I use AXIOS in functional poment it returns first empty array and then exact api response.data / after render. So return functions returns empty array but in the fact the data is there but after rendering
The api response
{
"eventId": "3c6a12e3-ac96-4f9d-9d26-7c7a6c730198",
"organizerId": "23a41cd1-e60e-41ff-b5d3-13815ed9b3a9",
"eventDate": "2021-11-28T14:14:16.191167",
"eventPlayerLimit": 10,
"eventFee": 0.0,
"playerSubscriptions": [
{
"subscriptionId": "2616720f-7106-429e-89f6-97be51dfbaf6",
"subscriptionPaymentDone": "true",
"subscriptionDate": "2021-11-28T14:14:16.217146",
"subscriptionApproved": "true",
"eventTitle": "Title",
"eventDate": "2021-11-28T14:14:16.191167",
"playerId": "a04d3ca2-af3d-4655-9eaf-6a892efe2dab",
"playerEmail": "[email protected]"
}
],
"title": "Title"
}
And the ponent body
import React, {Component, useEffect, useState} from "react";
import {Card, Button, Table} from "react-bootstrap";
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faCoffee } from '@fortawesome/free-solid-svg-icons'
import axios from "axios";
import {useParams} from "react-router-dom";
function EventsDetails () {
const [eventDetails, setEventDetails] = useState([])
let {id} = useParams();
function getEvents() {
axios.get("http://localhost:8080/api/events/"+id)
.then(response => response.data)
.then((data) => {
setEventDetails(data)
});
}
useEffect(()=>{
getEvents();
},[])
console.log(id);
console.log(eventDetails);
return (
<Card className={"border border-dark bg-dark text-white"}>
<Card.Header><FontAwesomeIcon icon={faCoffee} /> Events</Card.Header>
<Card.Body>
<Table bordered hover striped variant="dark">
<thead>
<tr align="center">
<th>Event Date</th>
<th>Event title</th>
<th>Localization</th>
<th>Payment Fee</th>
<th>Subscribed users</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{eventDetails.length === 0 ?
<tr align="center">
<td colSpan="6">No events available</td>
</tr> :
<tr align="center">
<td colSpan="6">{eventDetails.length}</td>
</tr>
}
</tbody>
</Table>
</Card.Body>
</Card>
)
}export default EventsDetails
Console log
Share Improve this question asked Nov 28, 2021 at 20:23 JustMJustM 1281 gold badge4 silver badges10 bronze badges 2- What is your question? This is expected behavior: the request is asynchronous and doesn't block the ponent render – Nick Commented Nov 28, 2021 at 20:27
- 1 when you call an api the data are not available until the http request is fulfilled. For this reason there is a moment in which data are not available (first render). When data e from the API call another render is done with the eventDetail state filled in with the response. – Antonio Pantano Commented Nov 28, 2021 at 20:29
3 Answers
Reset to default 1That is the expected behavior. Your first console.log
is being executed before the state update. The function is not returning an empty array, you're seeing the default state from const [eventDetails, setEventDetails] = useState([])
being logged.
Initially on the page load... you dont have data because API takes some moment before it respond with data and meanwhile your ponent already rendered with empty array i.e no data...
at some moment later the API es back with data and update the state but you've already seen a ponent without required data...
So a way around it is
You put a ponent/content/loader to be shown while you're waiting for API to give you data to be shown... and when that data es you take back the loader ponent and show that data from API
With codes it could be something as below
import React, {Component, useEffect, useState} from "react";
import {Card, Button, Table} from "react-bootstrap";
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faCoffee } from '@fortawesome/free-solid-svg-icons'
import axios from "axios";
import {useParams} from "react-router-dom";
function EventsDetails () {
const [eventDetails, setEventDetails] = useState([])
const [isLoading, setIsLoading] = useState(false);
let {id} = useParams();
function getEvents() {
setIsLoading(true);
axios.get("http://localhost:8080/api/events/"+id)
.then(response => response.data)
.then((data) => {
setEventDetails(data)
setIsLoading(false);
});
}
useEffect(()=>{
getEvents();
},[])
....//removed for brevity
return <>{isLoading ? <DisplayLoader /> : <DisplayData />}</>
Thanks guys. Sometimes I have undefined errors. Now I understand why. My function is called on every render. So I added Loader
本文标签: javascriptRest API React and AXIOS in functional componentStack Overflow
版权声明:本文标题:javascript - Rest API React and AXIOS in functional component - Stack Overflow 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/questions/1745597423a2158254.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论