Redirecionamentos de route permitem que você navegue automaticamente usuários de uma route para outra. Pense nisso como encaminhamento de correspondência, onde correspondências destinadas a um endereço são enviadas para um endereço diferente. Isso é útil para lidar com URLs legadas, implementar routes padrão ou gerenciar controle de acesso.
Como configurar redirecionamentos
Você pode definir redirecionamentos na sua configuração de route com a propriedade redirectTo. Esta propriedade aceita uma string.
import { Routes } from '@angular/router';const routes: Routes = [ // Simple redirect { path: 'marketing', redirectTo: 'newsletter' }, // Redirect with path parameters { path: 'legacy-user/:id', redirectTo: 'users/:id' }, // Redirect any other URLs that don't match // (also known as a "wildcard" redirect) { path: '**', redirectTo: '/login' }];
Neste exemplo, existem três redirecionamentos:
- Quando um usuário visita o caminho
/marketing, ele é redirecionado para/newsletter. - Quando um usuário visita qualquer caminho
/legacy-user/:id, ele é roteado para o caminho/users/:idcorrespondente. - Quando um usuário visita qualquer caminho que não está definido no router, ele é redirecionado para a página de login por causa da definição de caminho curinga
**.
Entendendo pathMatch
A propriedade pathMatch em routes permite que os desenvolvedores controlem como o Angular corresponde uma URL às routes.
Existem dois valores que pathMatch aceita:
| Value | Description |
|---|---|
'full' |
O caminho completo da URL deve corresponder exatamente |
'prefix' |
Apenas o início da URL precisa corresponder |
Por padrão, todos os redirecionamentos usam a estratégia prefix.
pathMatch: 'prefix'
pathMatch: 'prefix' é a estratégia padrão e ideal quando você quer que o Angular Router corresponda todas as routes subsequentes ao disparar um redirecionamento.
export const routes: Routes = [ // This redirect route is equivalent to… { path: 'news', redirectTo: 'blog }, // This explicitly defined route redirect pathMatch { path: 'news', redirectTo: 'blog', pathMatch: 'prefix' },];
Neste exemplo, todas as routes que são prefixadas com news são redirecionadas para seus equivalentes /blog. Aqui estão alguns exemplos onde os usuários são redirecionados ao visitar o antigo prefixo news:
/newsredireciona para/blog/news/articleredireciona para/blog/article/news/article/:idredireciona para/blog/article/:id
pathMatch: 'full'
Por outro lado, pathMatch: 'full' é útil quando você quer que o Angular Router redirecione apenas um caminho específico.
export const routes: Routes = [ { path: '', redirectTo: '/dashboard', pathMatch: 'full' },];
Neste exemplo, toda vez que o usuário visita a URL raiz (ou seja, ''), o router redireciona esse usuário para a página '/dashboard'.
Quaisquer páginas subsequentes (por exemplo, /login, /about, /product/id, etc.), são ignoradas e não disparam um redirecionamento.
DICA: Tenha cuidado ao configurar um redirecionamento na página raiz (ou seja, "/" ou ""). Se você não definir pathMatch: 'full', o router redirecionará todas as URLs.
Para ilustrar ainda mais isso, se o exemplo de news da seção anterior usasse pathMatch: 'full' em vez disso:
export const routes: Routes = [ { path: 'news', redirectTo: '/blog', pathMatch: 'full' },];
Isso significa que:
- Apenas o caminho
/newsserá redirecionado para/blog. - Quaisquer segmentos subsequentes, como
/news/articlesou/news/articles/1, não redirecionariam com o novo prefixo/blog.
Redirecionamentos condicionais
A propriedade redirectTo também pode aceitar uma função para adicionar lógica a como os usuários são redirecionados.
A função tem acesso apenas a parte dos dados de ActivatedRouteSnapshot, já que alguns dados não são conhecidos com precisão na fase de correspondência de route. Exemplos incluem: títulos resolvidos, components carregados sob demanda, etc.
Ela normalmente retorna uma string ou URLTree, mas também pode retornar um observable ou promise.
Aqui está um exemplo onde o usuário é redirecionado para um menu diferente com base na hora do dia:
import { Routes } from '@angular/router';import { MenuComponent } from './menu/menu.component';export const routes: Routes = [ { path: 'restaurant/:location/menu', redirectTo: (activatedRouteSnapshot) => { const location = activatedRouteSnapshot.params['location']; const currentHour = new Date().getHours(); // Check if user requested a specific meal via query parameter if (activatedRouteSnapshot.queryParams['meal']) { return `/restaurant/${location}/menu/${queryParams['meal']}`; } // Auto-redirect based on time of day if (currentHour >= 5 && currentHour < 11) { return `/restaurant/${location}/menu/breakfast`; } else if (currentHour >= 11 && currentHour < 17) { return `/restaurant/${location}/menu/lunch`; } else { return `/restaurant/${location}/menu/dinner`; } } }, // Destination routes { path: 'restaurant/:location/menu/breakfast', component: MenuComponent }, { path: 'restaurant/:location/menu/lunch', component: MenuComponent }, { path: 'restaurant/:location/menu/dinner', component: MenuComponent }, // Default redirect { path: '', redirectTo: '/restaurant/downtown/menu', pathMatch: 'full' }];
Para saber mais, confira a documentação da API para RedirectFunction.
Próximos passos
Para mais informações sobre a propriedade redirectTo, confira a documentação da API.