Skip to content
Documentação
Pre-obtendo Dados

Pre-obtendo Dados

Dados de Página Top-Level

Existem muitos jeitos de pre-obter os dados para SWR. Para requisições de página top-level, rel="preload" (opens in a new tab) é altamente recomendado:

<link rel="preload" href="/api/data" as="fetch" crossorigin="anonymous">

Basta apenas colocá-lo dentro do seu <head> do HTML. É fácil, rápido e nativo.

Irá pré-obter os dados quando o HTML carregar, antes mesmo de iniciar a baixar o JavaScript. Todos os seus pedidos de obtenção de dados com o mesmo URL vão usar o resultado (inclusive SWR, de modo que você pode usar o SWR para obter os dados de página top-level).

Pré-obtenção Programática

SWR fornece a API preload para pré-obter os recursos programáticamente e armazenar os resultados em cache. preload aceita key e fetcher como argumentos.

Você pode chamar a função preload até fora do React.

import { useState } from 'react'
import useSWR, { preload } from 'swr'
 
const fetcher = (url) => fetch(url).then((res) => res.json())
 
// Pré-obtenha o recurso antes de renderizar o componente User abaixo,
// isso previne potenciais cascatas de requisição na sua aplicação.
// Você pode também começar a pré-obter quando passar o mouse sobre o botão ou link, também.
preload('/api/user', fetcher)
 
function User() {
  const { data } = useSWR('/api/user', fetcher)
  ...
}
 
export default function App() {
  const [show, setShow] = useState(false)
  return (
    <div>
      <button onClick={() => setShow(true)}>Show User</button>
      {show ? <User /> : null}
    </div>
  )
}

Dentro da árvore de renderização do React, preload também está disponível para usar em manipuladores de eventos ou efeitos.

function App({ userId }) {
  const [show, setShow] = useState(false)
 
  // pre-obtenha em efeitos
  useEffect(() => {
    preload('/api/user?id=' + userId, fetcher)
  }, [userId])
 
  return (
    <div>
      <button
        onClick={() => setShow(true)}
        {/* pre-obtenha em callbacks */}
        onHover={() => preload('/api/user?id=' + userId, fetcher)}
      >
        Show User
      </button>
      {show ? <User /> : null}
    </div>
  )
}

Junto com técnicas como page prefetching (opens in a new tab) no Next.js, você vai ser capaz de carregar ambos a próxima página e os dados instantaneamente.

No Modo Suspense, você deve utilizar preload para evitar problemas de cascata.

import useSWR, { preload } from 'swr'
 
// should call before rendering
preload('/api/user', fetcher);
preload('/api/movies', fetcher);
 
const Page = () => {
  // Os hooks useSWR abaixo vão suspender a renderização, mas as requisições para `/api/user` e `/api/movies` já começaram por `preload`,
  // então o problema de cascata não acontece.
  const { data: user } = useSWR('/api/user', fetcher, { suspense: true });
  const { data: movies } = useSWR('/api/movies', fetcher, { suspense: true });
  return (
    <div>
      <User user={user} />
      <Movies movies={movies} />
    </div>
  );
}

Dados de Pré-preenchimento

Se você quiser preencher dados existentes no cache do SWR, você pode usar a opção fallbackData. Por exemplo:

useSWR('/api/data', fetcher, { fallbackData: prefetchedData })

Se o SWR ainda não obtiver os dados, este hook retornará prefetchedData como um fallback.

Você pode também configurar isso para todos os hooks SWR e várias chaves com <SWRConfig> e a opção fallback. Veja SSG e SSR com Next.js para mais detalhes.