O React Router é uma biblioteca de roteamento popular usada em aplicativos React para gerenciar a navegação e fornecer funcionalidade de roteamento contínua. No entanto, como acontece com qualquer biblioteca, atualizações e alterações podem ocorrer ao longo do tempo, o que pode levar a erros porque alguns recursos se tornam obsoletos.

Um erro comum que você pode encontrar ao implementar o roteamento em aplicativos React é o erro “‘Switch’ is not exported from ‘react-router-dom'”.

Este erro ocorre quando você atualiza de uma versão antiga do React Router para uma versão mais recente (atualmente v6) sem levar em conta alguns componentes obsoletos, como o <Switch>.

Neste artigo, você aprenderá as causas desse erro e como corrigi-lo, garantindo o roteamento e a navegação suave em seu aplicativo React.

O que causa o erro “Switch is not exported from ‘react-router-dom’ in React”?

No React Router versão 5 e anteriores, o componente <Switch> foi usado para envolver todas as rotas em seu aplicativo React. Na versão 6 do React Router, o componente <Switch> foi descontinuado e substituído pelo componente <Routes>.

O componente <Routes> no React Router v6 oferece uma abordagem mais declarativa e flexível para o roteamento em comparação com o componente <Switch>, que foi descontinuado.

Portanto, se você tiver atualizado recentemente para o React Router v6 (ou uma versão mais recente) e ainda estiver tentando usar o componente <Switch> obsoleto, encontrará o erro “‘Switch’ is not exported from ‘react-router-dom'”.

“Switch is not exported from 'react-router-dom' in React”.
“Switch is not exported from ‘react-router-dom’ in React”.

2 maneiras de corrigir o erro “Switch is not exported from ‘react-router-dom’ in React”

Esse erro pode ser corrigido de duas maneiras, dependendo da abordagem desejada e dos requisitos do seu projeto. As duas maneiras são as seguintes:

  • Usar <Routes> em vez de <Switch>
  • Fazer downgrade da versão do react-router-dom para 5 ou inferior

1. Use <Routes> em vez de <Switch>

Uma maneira de corrigir o erro “‘Switch’ is not exported from ‘react-router-dom'” é substituir <Switch> por <Routes>.

Vamos dar uma olhada em um exemplo de como atualizar seu código de roteamento usando o componente obsoleto <Switch> na versão 5 do React Router para o novo componente <Routes> na versão 6 do React Router.

No React Router versão 5:

import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import Home from './components/Home';
import About from './components/About';
import Contact from './components/Contact';

const App = () => {
  return (
    <Router>
      <Switch>
        <Route exact path="/" component={Home} />
        <Route path="/about" component={About} />
        <Route path="/contact" component={Contact} />
      </Switch>
    </Router>
  );
};

export default App;

No código acima, estamos usando o componente <Switch> para envolver nossas rotas. No entanto, na versão 6 do React Router, precisamos atualizar nosso código de roteamento para usar o componente <Routes> e seguir a API atualizada.

Veja como o mesmo exemplo ficaria no React Router versão 6 e posteriores:

import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import Home from './components/Home';
import About from './components/About';
import Contact from './components/Contact';

const App = () => {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/contact" element={<Contact />} />
      </Routes>
    </Router>
  );
};

export default App;

Como você pode ver, substituímos o componente <Switch> pelo componente <Routes>, e cada <Route> agora é definido usando a propriedade element em vez da propriedade component.

Vantagens das rotas em relação ao switch no React Router v6

Com o lançamento do React Router v6, a introdução do componente <Routes> trouxe várias vantagens em relação ao componente <Switch> obsoleto nas versões anteriores.

Vejamos algumas vantagens de usar <Routes> para lidar com a lógica de roteamento em seus aplicativos React.

1. Roteamento aninhado aprimorado

O elemento <Routes> permite configurações de roteamento aninhado melhoradas em comparação com <Switch>. Com <Routes>, você pode definir rotas aninhadas facilmente, aninhando componentes <Route> dentro de outros componentes <Routes>, tornando mais intuitivo e organizado o manejo de estruturas de roteamento complexas.

Isso pode ajudar a simplificar o gerenciamento da lógica de roteamento em aplicativos maiores com vários níveis de rotas aninhadas.

<Routes>
  <Route path="/" element={<Home />} />
  <Route path="/about" element={<About />}>
    <Route path="/team" element={<Team />} />
    <Route path="/history" element={<History />} />
  </Route>
  <Route path="/contact" element={<Contact />} />
</Routes>
2. Correspondência dinâmica de rotas

<Routes> oferece mais flexibilidade na correspondência e na renderização de rotas de forma dinâmica com base nos parâmetros de rota. Isso permite um roteamento mais dinâmico e orientado por dados em seu aplicativo.

<Routes>
  <Route path="/" element={<Home />} />
  <Route path="/users/:userId" element={<UserProfile />} />
  <Route path="/products/:productId" element={<ProductDetail />} />
</Routes>
3. Tratamento de erros aprimorado

<Routes> oferece um tratamento de erros aprimorado para rotas não correspondentes. Se uma rota não for encontrada, o <Routes> renderiza automaticamente um componente “Not Found” ou um componente de erro personalizado que você pode definir.

Isso pode ajudar a aprimorar a experiência do usuário, tratando com elegância URLs inválidos ou rotas que não existem no seu aplicativo.

<Routes>
  <Route path="/" element={<Home />} />
  <Route path="/about" element={<About />} />
  {/* Error route */}
  <Route path="*" element={<NotFound />} />
</Routes>

2. Faça o downgrade da versão do react-router-dom para 5 ou inferior

Se preferir continuar usando <Switch> em seu projeto, você pode corrigir o erro fazendo o downgrade da versão do react-router-dom para a 5 ou inferior.

Essa pode ser uma solução viável se você tiver um projeto existente que foi criado usando uma versão mais antiga do React Router. Você pode fazer isso desinstalando primeiro a versão mais recente do React Router que você instalou usando o comando abaixo:

npm uninstall react-router-dom

Agora você pode usar esse comando para instalar a última versão principal que incluiu o componente <Switch>, que é a versão 5.2.0:

npm install [email protected]

Resumo

Neste artigo, você aprendeu sobre o erro “Switch is not exported from ‘react-router-dom’ in React” e explorou algumas maneiras de corrigi-lo. Você também aprendeu as vantagens de usar o mais novo componente <Routes> em vez do obsoleto componente <Switch>.

Ao iniciar um novo projeto, é recomendável que você sempre use a versão mais recente do React Router, pois ela oferece melhorias significativas e atualizações contínuas.

No entanto, suponha que você esteja trabalhando em um projeto existente e não tenha tempo para atualizar seu código extensivamente para usar a nova sintaxe e os componentes v6 do React Router. Nesse caso, você deve continuar usando a versão mais antiga do React Router que funciona com seu código.

Agora é a sua vez: Você já se deparou com esse problema? Como resolveu? Existem outras abordagens que você utilizou e que não foram mencionadas neste artigo?Compartilhe sua experiência na seção de comentários!