Link & href
Navegação declarativa e links amigáveis para prefetch. Link mapeia para navegação semelhante a âncoras na web e alvos de toque acessíveis em nativo - router lida com fluxos imperativos após efeitos colaterais.
Busque em todas as páginas da documentação
Navegação declarativa e links amigáveis para prefetch. Link mapeia para navegação semelhante a âncoras na web e alvos de toque acessíveis em nativo - router lida com fluxos imperativos após efeitos colaterais.
Cartão de receita de referência rápida - pronto para copiar e colar.
import { Link, router, type Href } from "expo-router";
import { Pressable, Text, View } from "react-native";
// href de string - apenas caminhos estáticos
<Link href="/settings">Configurações</Link>
// href de objeto - segmentos dinâmicos (preferido)
<Link href={{ pathname: "/orders/[id]", params: { id: "42" } }}>
Pedido 42
</Link>
// Imperativo após mutação
router.replace("/(tabs)");
// Prefetch ao pairar/focar (web) ou manualmente
<Link href="/orders" prefetch />// src/navigation/routes.ts
import type { Href } from "expo-router";
export const routes = {
home: "/" as Href,
settings: "/settings" as Href,
orderDetail: (id: string): Href => ({
pathname: "/orders/[id]",
params: { id },
}),
};Quando usar isso:
Link - linhas de lista, links de texto inline, navegação adjacente a abas, âncoras web amigáveis para SEOrouter.push - navegar após envio de formulário, digitalizar QR ou callback de timerrouter.replace - pós-login, pós-logout, conclusão de onboardingprefetch - telas com bundles pesados ou waterfalls de dados lentosTela de lista com Link, Pressable personalizado via asChild, navegação imperativa e construtores de href centralizados.
// src/navigation/routes.ts
import type { Href } from "expo-router";
export function orderDetailHref(id: string): Href {
return { pathname: "/orders/[id]", params: { id } };
}
export function settingsHref(): Href {
return "/settings";
}// features/orders/ui/OrdersListScreen.tsx
import { Link, router } from "expo-router";
import { Pressable, Text, View } from "react-native";
import { orderDetailHref } from "@/navigation/routes";
const ORDERS = [
{ id: "101", label: "Envio de widget" },
{ id: "102", label: "Peça de reposição" },
];
export function OrdersListScreen() {
return (
<View style={{ flex: 1, padding: 16, gap: 12 }}>
{ORDERS.map((order) => (
<Link key={order.id} href={orderDetailHref(order.id)} prefetch asChild>
<Pressable style={{ padding: 12, backgroundColor: "#f1f5f9", borderRadius: 8 }}>
<Text>{order.label}</Text>
</Pressable>
</Link>
))}
<Link href="/settings">Configurações da conta</Link>
<Pressable
onPress={() => router.push(orderDetailHref("draft"))}
accessibilityRole="button"
>
<Text>Criar rascunho (imperativo)</Text>
</Pressable>
</View>
);
}// Após o envio bem-sucedido do formulário - replace evita a pilha de volta para o formulário
import { router } from "expo-router";
async function onSubmit() {
await saveProfile();
router.replace("/(tabs)/profile");
}// Fechar fluxo modal
import { router } from "expo-router";
function closeModal() {
if (router.canGoBack()) {
router.back();
} else {
router.replace("/");
}
}href| Forma | Exemplo | Rotas tipadas |
|---|---|---|
| Caminho de String | "/settings" | Rotas estáticas |
| Objeto | { pathname: "/orders/[id]", params: { id } } | Rotas dinâmicas |
| Relativo | "./details" | Irmão dentro da pasta |
| Externo | "https://expo.dev" | Abre navegador / app externo |
// Navegação relativa dentro de app/orders/
<Link href="./[id]" params={{ id: "5" }}>Relativo</Link>href="/search?q=shoes" ou params: { q: "shoes" } dependendo da forma da rotapathname inválidos falhem em tempo de compilação - veja Rotas TipadasLink vs router| API | Estilo | Melhor para |
|---|---|---|
<Link href> | Declarativo | Listas, navegação inline, prefetch |
router.push | Imperativo | Pós-assíncrono, redirecionamentos programáticos |
router.replace | Imperativo | Transições de autenticação, sem volta |
router.back | Imperativo | Cancelar, fechar modal |
router.navigate | Imperativo | Ir para rota se existir, senão push (semelhante à web) |
// Props de Link que importam em produção
<Link
href="/orders"
prefetch // pré-carrega o módulo da rota
replace // substitui o histórico em vez de push
push // força push mesmo quando replace seria o padrão
asChild // mescla em Pressable filho
disabled={!isReady}
/>prefetch em Link - Expo Router carrega o bundle JavaScript da rota de destino antes da navegaçãoasChild<Link href="/settings" asChild>
<Pressable style={styles.row}>
<Text>Configurações</Text>
</Pressable>
</Link>onPress, href na web) - use Pressable ou componentes personalizados que espalham propsLinkaccessibilityRole="link" na web; Pressable herda o comportamento de link de Link// packages/navigation/src/hrefs.ts (monorepo)
export const orderDetailHref = (id: string) =>
({ pathname: "/orders/[id]", params: { id } }) as const;packages/navigation quando as formas de rota correspondemConcatenação de strings para caminhos dinâmicos - href={'/orders/' + id} ignora rotas tipadas e quebra quando os segmentos mudam. Correção: Forma de objeto ou orderDetailHref(id).
router.push após login - o gesto de voltar retorna ao login. Correção: router.replace.
Link envolvendo componentes que não encaminham props - linhas personalizadas ignoram o toque. Correção: asChild + espalhar props, ou usar Pressable.
URLs externas em router.push - podem não abrir o navegador. Correção: import { openURL } from "expo-linking" para links https://.
Prefetching de rotas protegidas - exibe conteúdo não autorizado. Correção: Restrinja o prefetch com verificação de sessão ou pule em telas de autenticação.
accessibilityRole ausente em Pressable imperativo - leitores de tela anunciam "botão" para navegação. Correção: accessibilityRole="link" ou prefira Link.
Grandes cargas de payload de params em href - inchaço do estado de navegação, logs vazam dados. Correção: Passe apenas IDs; carregue corpos do store ou API.
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
<Link href> | Navegação padrão em lista/inline | Após mutação assíncrona antes de navegar |
router.push / replace | Controle imperativo | Você precisa de prefetch e semântica de link |
useNavigation().navigate | Escape hatch do React Navigation | Caminhos padrão do Expo Router existem |
Componente Redirect | Gate de autenticação declarativo no layout | Navegação acionada por botão |
| URL de deep link manualmente | Payload de notificação push | Toques dentro do app - use href tipado |
String href | Protótipos rápidos | Rotas dinâmicas de produção |
Link para UI tocável pelo usuário que navega para uma rota conhecida.router.push após a conclusão de trabalho assíncrono (salvar, digitalizar, conceder permissão).router.replace quando voltar não deve retornar à tela atual.router.push({ pathname: "/search", params: { q: "shoes", sort: "price" } });Leia com useLocalSearchParams(). Prefira segmentos de caminho para IDs de entidade; consulta para filtros.
Sim - Link renderiza uma âncora na web com navegação do lado do cliente. Valores de href em string melhoram a rastreabilidade para builds web públicas.
<Link href="/checkout" disabled={!cartReady} asChild>
<Pressable disabled={!cartReady}>
<Text>Checkout</Text>
</Pressable>
</Link>Defina disabled tanto em Link quanto no filho ao usar asChild.
Retorna se a pilha tem uma tela anterior. Use antes de router.back() em modais abertos por deep link - volte para router.replace("/").
import * as Linking from "expo-linking";
await Linking.openURL("https://docs.expo.dev/router/introduction/");Não passe URLs externas para router.push, a menos que você tenha configurado manipuladores de links externos.
Prefira <Link prefetch />. Para casos avançados, consulte a documentação do Expo Router SDK 57 para utilitários prefetch na instância do router - a disponibilidade evolui a cada versão menor.
./[id] resolve relativamente ao diretório da rota atual - útil dentro de irmãos de app/orders/. Prefira construtores absolutos em módulos compartilhados para clareza.
navigate deduplica se a rota já estiver focada (semelhante à web). push sempre adiciona uma entrada na pilha. Use push para pilhas de detalhes duplicadas intencionais; navigate para comportamento semelhante a abas.
Tipo de retorno Href de expo-router. Com experiments.typedRoutes, pathnames inválidos geram erro em tempo de compilação. Veja Rotas Tipadas.
Href em tempo de compilaçãoRedirect vs router.replaceLink vs imperativasVersões da Pilha: Esta página foi escrita para React 19.2.3, React Native 0.86.0 e Expo SDK 57 (
expo~57.0.4).
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026