Skip to content
Documentação
Suspense

Suspense

🚨

O React não recomenda usar Suspense em frameworks de dados como o SWR (Mais informações). Essas APIs podem mudar no futuro como resultados da nossa pesquisa.

Você pode habilitar a opção suspense para usar SWR com React Suspense:

import { Suspense } from 'react'
import useSWR from 'swr'
 
function Profile () {
  const { data } = useSWR('/api/user', fetcher, { suspense: true })
  return <div>hello, {data.name}</div>
}
 
function App () {
  return (
    <Suspense fallback={<div>carregando...</div>}>
      <Profile/>
    </Suspense>
  )
}
💡

Note que a opção suspense não é permitida a mudar no ciclo de vida.

Em modo Suspense, data é sempre a resposta do fetch (então você não precisa checar se é undefined). Mas se um erro ocorreu, você precisa usar um limite de erro (Error Boundary) (opens in a new tab) para o capturar:

<ErrorBoundary fallback={<h2>Não foi possível obter posts.</h2>}>
  <Suspense fallback={<h1>Carregando posts...</h1>}>
    <Profile />
  </Suspense>
</ErrorBoundary>
💡

O modo Suspense suspende a renderização até que os dados estejam prontos, o que significa que pode causar problemas de waterfall facilmente. Para evitar isso, você deve fazer prefetch de recursos antes de renderizar. Mais informações

Nota: Com Fetching Condicional

Normalmente, quando você habilita suspense, é garantido que data estará sempre pronto na renderização:

function Profile () {
  const { data } = useSWR('/api/user', fetcher, { suspense: true })
 
  // `data` nunca será `undefined`
  // ...
}

No entanto, ao usá-lo junto com uma busca condicional ou busca dependente, data será undefined se a solicitação estiver pausada:

function Profile () {
  const { data } = useSWR(isReady ? '/api/user' : null, fetcher, { suspense: true })
 
  // `data` será `undefined` se `isReady` é false
  // ...
}

Se você quiser ler mais detalhes técnicos sobre essa restrição, cheque a discussão aqui (opens in a new tab).

Server-Side Rendering

Quando usando o modo Suspense no lado do servidor (incluindo pre-rendering com Next.js), é obrigatório informar dados iniciais via fallbackData ou fallback. Isso significa que você não pode usar Suspense para obter dados no lado do servidor, mas fazendo a busca de dados totalmente do lado do cliente ou buscando os dados por meio do método de busca de dados à nível de framework (como getStaticProps com Next.js). Mais discussões podem ser enconrtradas aqui (opens in a new tab).