How to use React.Suspense with a api call?

Viewed 3949

I've read the doc about React.Suspense, it seems great, but how can I use it while performing an api call, with axios for example?

To be more specific, why this code doesn't work?

export default function Foo(){
const [state, setState] = useState()

useEffect(()=> {
    axios.get("url")
    .then(res=> setState(res.data))
    .catch(_=> setState(null)
}, [])

return (
    <Suspense fallback="loading data">
       <div>hello {state.name}</div>
    </Suspense>
)
}

Thanks!

2 Answers

According to the React documentation, what you are trying to achieve is possible. There is an experimental feature called Concurrent Mode. You can find the implementation details in React documentation. Link to the Suspense documentation: https://reactjs.org/docs/concurrent-mode-suspense.html

But there is a limitation, you have to use an npm package which leverages this feature. Relay is what is suggested by the React team.

This is the code sandbox link provided in the documentation itself.

https://codesandbox.io/s/frosty-hermann-bztrp

Suspense is used to asynchronously load Components, not APIs. It's used to lazily load components imported using React.lazy.

Even if you manage to render your component it'll not make any difference in your case. You'll need it for a different use case

Related