[React] Fetch Data with React Suspense

Let's get started with the simplest version of data fetching with React Suspense. It may feel a little awkward, but I promise you that you wont be writing your code like this. When Suspense is stable, there will be libraries that integrate with Suspense. But this is approximately what those abstractions will do, so it's a good thing to know.

 

For a normal React App process, we need to first init component 'PokemonInfo', then we send a fetch request to get data from server.

function App() {
  return (
    <div className="pokemon-info">
        <PokemonInfo />
    </div>
  )
}

 

Using Suspense, we don't need to wait component init, we can send request in the very beginning.

To do that, we can wrap the component inside:

<React.Suspense
    fallback={
      console.log('loading pokemon...') && <div>Loading pokemon...</div>
    }
>
  <Your-component / >
</React.Suspense>

You need to provide a 'fallback' prop which provide a JXS to rendering during fetching the data.

复制代码
function App() {
  return (
    <div className="pokemon-info">
      <React.Suspense
        fallback={
          console.log('loading pokemon...') && <div>Loading pokemon...</div>
        }
      >
        <PokemonInfo />
      </React.Suspense>
    </div>
  )
}
复制代码

 

For the data fetching and component rendering:

'pokemonPromise': send fetching request right away, then assign the data to variable 'pokemon'.

Inside component, we just check whether we have 'pokemon' data already, if not, we 'throw poekmonPromise', React Suspense will catch the promise, when it resolves, React will render the component.

复制代码
let pokemon
let pokemonPromise = fetchPokemon('pikachu').then(p => {
  console.log('promise resolve')
  pokemon = p
})

function PokemonInfo() {
  console.log('PokemonInfo init')

  if (!pokemon) {
    throw pokemonPromise // this API might change
  }

  return (
    <div>
      <div className="pokemon-info__img-wrapper">
        <img src={pokemon.image} alt={pokemon.name} />
      </div>
      <PokemonDataView pokemon={pokemon} />
    </div>
  )
}
复制代码
/*
loading pokemon... // fallback rendering
promise resolve.     // data fetched
loading pokemon... // re-rendering the component inside React.Suspense
PokemonInfo init.   // component rendered
*/

 

---

复制代码
import React from 'react'
import fetchPokemon from '../fetch-pokemon'
import {PokemonDataView} from '../utils'

let pokemon
let pokemonPromise = fetchPokemon('pikachu').then(p => {
  console.log('promise resolve')
  pokemon = p
})

function PokemonInfo() {
  console.log('PokemonInfo init')

  if (!pokemon) {
    throw pokemonPromise // this API might change
  }

  return (
    <div>
      <div className="pokemon-info__img-wrapper">
        <img src={pokemon.image} alt={pokemon.name} />
      </div>
      <PokemonDataView pokemon={pokemon} />
    </div>
  )
}

function App() {
  return (
    <div className="pokemon-info">
      <React.Suspense
        fallback={
          console.log('loading pokemon...') && <div>Loading pokemon...</div>
        }
      >
        <PokemonInfo />
      </React.Suspense>
    </div>
  )
}

export default App
复制代码

 

posted @   Zhentiw  阅读(540)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2017-12-08 [React] Controlling Form Values with React
2016-12-08 [Vue] Preload Data using Promises with Vue.js and Nuxt.js
点击右上角即可分享
微信分享提示