Marcelo Carmona
Publicado el

Entendiendo React.Suspense

Autores

Esta es una nueva característica que nos permite "detener" un render hasta que hayamos terminado una tarea (por ejemplo, cargar datos desde una API).

Vamos a buscar una tarea cuando el componente Task esté montado y guardaremos el resultado en una caché muy simple. La parte interesante que hay que entender es que, cuando lanzamos una promesa, esta es atrapada por Suspense y muestra un estado de carga hasta que la promesa se resuelve.

import React, { Suspense } from 'react'
import ReactDOM from 'react-dom'
import './styles.css'

function fetchFirstTask() {
  return fetch('https://jsonplaceholder.typicode.com/todos/1').then((response) => response.json())
}

let cache = null

function Task() {
  if (!cache) {
    throw fetchFirstTask().then((task) => (cache = task))
  }
  return (
    <div>
      {cache.completed ? '✅' : '⛔️'} {cache.title}
    </div>
  )
}

function App() {
  return (
    <div className="App">
      <h1>My task</h1>
      <Suspense fallback={<div>Loading...</div>}>
        <Task />
      </Suspense>
    </div>
  )
}

A veces tenemos una conexión rápida y el recurso se carga muy rápidamente. En este caso, tal vez no sea necesario mostrar un estado de carga, por lo que podemos usar maxDuration para evitar este parpadeo extraño.

<Suspense maxDuration={400} fallback={<div>Loading...</div>}>
  <Task />
</Suspense>