Busque em todas as páginas da documentação
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Passe null ou um valor falsy como chave para impedir o SWR de buscar dados. Use isso para aguardar dependências, controlar requisições com base em autenticação ou encadear buscas sequenciais.
"use client";
import useSWR from "swr";
function UserProjects({ userId }: { userId: string | null }) {
// Não buscará até que userId esteja disponível
const { data } = useSWR(userId ? `/api/users/${userId}/projects` : null, fetcher);
return <div>{data?.length ?? 0} projetos</div>;
}"use client";
import useSWR from "swr";
const fetcher = (url: string) => fetch(url).then((r) => r.json());
interface User {
id: string;
name: string;
teamId: string;
}
interface Team {
id: string;
name: string;
members: string[];
}
export default function UserTeamInfo({ userId }: { userId: string }) {
// Passo 1: Buscar usuário
const { data: user, isLoading: userLoading } = useSWR<User>(
`/api/users/${userId}`,
fetcher
);
// Passo 2: Buscar time apenas após o usuário carregar (fetching dependente)
const { data: team, isLoading: teamLoading } = useSWR<Team>(
user ? `/api/teams/${user.teamId}` : null,
fetcher
);
if (userLoading) return <p>Carregando usuário...</p>;
if (teamLoading) return <p>Carregando time para {user?.name}...</p>;
return (
<div>
<p>{user?.name} pertence ao time {team?.name}</p>
<p>O time tem {team?.members.length} membros</p>
</div>
);
}null, undefined, false ou "", o SWR pula o fetch inteiramente e retorna { data: undefined, error: undefined, isLoading: false }.() => condition ? key : null também é suportada e avaliada em cada renderização.Chave como função:
const { data } = useSWR(
() => (isLoggedIn ? `/api/profile` : null),
fetcher
);Múltiplas dependências:
const { data: user } = useSWR("/api/me", fetcher);
const { data: org } = useSWR(user ? `/api/orgs/${user.orgId}` : null, fetcher);
const { data: billing } = useSWR(
user && org ? `/api/orgs/${org.id}/billing` : null,
fetcher
);Condicional com chave de array:
const { data } = useSWR(
token ? ["/api/data", token] : null,
([url, token]) =>
fetch(url, { headers: { Authorization: `Bearer ${token}` } }).then((r) => r.json())
);Lançar erro na função de chave para pausar:
// Lançar um erro dentro da função de chave também pausa o fetch
const { data } = useSWR(
() => `/api/users/${userId ?? throwUndefined()}`,
fetcher
);
function throwUndefined(): never {
throw new Error("não está pronto");
}Data | undefined, pois o fetch pode ainda não ter sido executado.null, o TypeScript infere o tipo da chave como null. Use um tipo de união ou genérico para mantê-lo limpo.const { data } = useSWR<Team>(
user ? `/api/teams/${user.teamId}` : null,
fetcher
);
// data: Team | undefinednull para um valor real, isLoading se torna true para essa transição. Planeje sua UI de carregamento de acordo.null. No entanto, erros lançados na função de chave são capturados silenciosamente e não aparecem em error.| Abordagem | Prós | Contras |
|---|---|---|
| Chave null (SWR) | Declarativa, gatilho automático na mudança | Cria waterfall para fetches dependentes |
Opção enabled (React Query) | Flag booleana explícita | Não disponível nativamente no SWR |
Guarda useEffect | Padrão imperativo familiar | Perde os benefícios de cache e dedup do SWR |
| Join no lado do servidor | Requisição única, sem waterfall | Requer mudanças na API, menos flexível |
O SWR pula o fetch quando a chave é null, undefined, false ou uma string vazia "". Qualquer um desses valores falsy impedirá a requisição.
Ele retorna { data: undefined, error: undefined, isLoading: false }. Nenhuma busca é feita -- isLoading é false porque não há nada para carregar.
Derive a chave da segunda requisição dos dados da primeira requisição:
const { data: user } = useSWR("/api/me", fetcher);
const { data: team } = useSWR(
user ? `/api/teams/${user.teamId}` : null,
fetcher
);O fetch do time só executa após user estar disponível.
Sim. O SWR avalia uma função de chave em cada renderização:
const { data } = useSWR(
() => (isLoggedIn ? `/api/profile` : null),
fetcher
);Sim. Cada requisição encadeada espera pela anterior. Mantenha as cadeias de dependência curtas (2-3 no máximo) para evitar lentidão no carregamento das páginas. Se possível, combine os dados em um único endpoint de API no lado do servidor.
O SWR trata um erro lançado dentro da função de chave da mesma forma que uma chave null -- ele pausa o fetch. No entanto, o erro é capturado silenciosamente e não aparece no valor de retorno error.
const { data } = useSWR(
token ? ["/api/data", token] : null,
([url, token]) =>
fetch(url, {
headers: { Authorization: `Bearer ${token}` },
}).then((r) => r.json())
);Não. Uma chave null significa "não buscar". Não é um estado de erro. error permanece undefined e isLoading é false. Não confunda fetching condicional com tratamento de erros.
O tipo de dados permanece Data | undefined, pois o fetch pode ainda não ter sido executado. Use um tipo de união ou genérico para mantê-lo limpo:
const { data } = useSWR<Team>(
user ? `/api/teams/${user.teamId}` : null,
fetcher
);
// data: Team | undefinedisLoading se torna true para essa transição enquanto o SWR busca dados para a chave recém-truthy. Planeje sua UI de carregamento para levar em conta essa mudança de estado.
O SWR usa chaves null/falsy para impedir o fetch, enquanto o React Query tem uma opção booleana explícita enabled. A abordagem do SWR é declarativa e baseada em chave; a do React Query é mais explícita, mas não disponível nativamente no SWR.
Revisado por Chris St. John·Última atualização: 10 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥