'Spinner is not working with ternary operator
import React, { useEffect, useState } from 'react';
import { Spinner } from 'react-bootstrap';
import Country from '../Country/Country'
const Countries = () => {
const[countries,setCountries]=useState([])
const [isLoading,setLoading]=useState(true)
useEffect(()=>{
fetch('https://restcountries.com/v3.1/all')
.then(res=>res.json())
.then(data=>setCountries(data))
setLoading(false)
},[])
return (
<div className='container'>
<div className="row row-cols-lg-4 row-cols-md-2 row-cols-sm-1 row-cols-1 g-2 mt-3">
{
isLoading?<Spinner animation='border'/>:countries.map(country=><Country key={Math.random(1,10)} country={country} />)
}
</div>
</div>
);
};
export default Countries;
Spinner is working Outside { }.But when I am trying this->
{isLoading?<Spinner animation='border'/>:countries.map(country=><Country key={Math.random(1,10)} country={country} />)}.
It is not working.I want to say It did not show any spinner before data showing
Solution 1:[1]
Try to disable spinner after response arrive:
useEffect(()=>{
fetch('https://restcountries.com/v3.1/all')
.then(res=>res.json())
.then(data=>{
setCountries(data)
setLoading(false)
})
I suggest you to use only countries state:
const[countries,setCountries]=useState(null)
....
!countries?<Spinner animation='border'/>:countries.map(....
},[])
Solution 2:[2]
First, make setLoading false whenever it gets data:
useEffect(() => {
fetch("https://restcountries.com/v3.1/all")
.then((res) => res.json())
.then((data) => {
setCountries(data);
setLoading(false);
});
}, []);
Use a function to render countries for good practise:
const renderCountries = () => {
countries.map((country) => (
<Country key={Math.random(1, 10)} country={country} />
));
};
Finally, check isLoading then show spinner other invoke the function to show countries:
{isLoading ? <Spinner animation="border" /> : renderCountries()}
Solution 3:[3]
You should be logging what isLoading is right before the return. You should also put the state change in the final then to confirm that there is data and it has finished being retrieved.
useEffect(()=>{
fetch('https://restcountries.com/v3.1/all')
.then(res=>{
if (!res.ok){
console.log(res)
} else {
res.json()
}
}).then(data=>{
setCountries(data)
setLoading(false) // here is the state change
})
})
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Max |
| Solution 2 | |
| Solution 3 |
