04 ReactRouterDom
React Router Dom#
O React Router DOM é uma biblioteca JavaScript utilizada para criar aplicativos de página única (SPA) com rotas dinâmicas. Ele é baseado na biblioteca React e oferece um conjunto de componentes para gerenciar a navegação de uma aplicação web.
Os componentes principais do React Router DOM são o BrowserRouter, Routes, Route e Link. O BrowserRouter é responsável por fornecer o contexto para os componentes de roteamento e deve ser envolvido em torno de todo o aplicativo. O Routes é utilizado para encapsular componentes Route. O Route é utilizado para definir uma rota específica e renderizar um componente correspondente a essa rota. Já o Link é utilizado para criar links clicáveis que levam a uma rota específica.
Inicie um novo projeto, abra o arquivo app.js, substitua o conteúdo e execute.
// src/App.js
import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';
import './App.css';
function App() {
return (
<BrowserRouter>
<Routes>
<Route exact path="/" element={<FirstPage />} />
<Route path="/next" element={<SecondPage />} />
</Routes>
</BrowserRouter>
);
}
function FirstPage() {
return (
<div>
<p>Primeira Página</p>
<button type='button'>
<Link to='/next'>
Próxima Página
</Link>
</button>
</div>
)
}
function SecondPage() {
return (
<div>
<p>Segunda Página</p>
<button type='button'>
<Link to='/'>
Página Anterior
</Link>
</button>
</div>
)
}
export default App;
Para executar abra o terminal:
npm start
Para tornar o código mais escalável, quebra-se a o código acima, separando as páginas em arquivos de páginas e a configuração das rotas em um arquivo separado. Além de criar uma pasta para os estilos.
my-app/
├── node_modules/
├── public/
│ ├── index.html
│ ├── favicon.ico
│ └── manifest.json
├── src/
│ ├── pages
│ │ ├── firstPage.js
│ │ └── secondPage.js
│ ├── styles
│ │ ├── App.css
│ │ └── index.css
│ ├── App.js
│ ├── index.js
│ ├── reportWebVitals.js
│ ├── router.js
│ ├── setupTests.js
├── .gitignore
├── package-lock.json
├── package.json
└── README.md
// src/index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import reportWebVitals from './reportWebVitals';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
// src/pages/firstPage.js
import {Link} from 'react-router-dom'
function FirstPage() {
return (
<div>
<p>Primeira Página</p>
<button type='button'>
<Link to='/next'>
Próxima Página
</Link>
</button>
</div>
)
}
export default FirstPage
import {Link} from 'react-router-dom'
: Importa o componente Link do pacote react-router-dom. O Link é um componente usado para criar links em um aplicativo React.
function FirstPage() { ... }
: Define o componente FirstPage como uma função que retorna um elemento JSX. O componente é definido aqui como uma função, mas também poderia ser definido como uma classe.
<div> ... </div>
: Cria um elemento div que contém o restante do conteúdo da página.
<p>Primeira Página</p>
: Cria um elemento p que contém o texto "Primeira Página".
<button type='button'> ... </button>
: Cria um botão que contém o link para a próxima página. O atributo type='button' define o tipo do botão como um botão normal, para evitar que a página seja recarregada quando o botão é clicado.
<Link to='/next'> ... </Link>
: Cria um componente Link com o texto "Próxima Página" e um atributo ##to## que especifica a rota da próxima página (/next).
export default FirstPage
: Exporta o componente FirstPage como o componente padrão deste módulo. Isso permite que ele seja importado em outros arquivos do aplicativo usando import FirstPage from './firstPage'
.
// src/pages/secondPage.js
import {Link} from 'react-router-dom'
function SecondPage() {
return (
<div>
<p>Segunda Página</p>
<button type='button'>
<Link to='/'>
Página Anterior
</Link>
</button>
</div>
)
}
export default SecondPage
import {Link} from 'react-router-dom'
: Importa o componente Link do pacote react-router-dom. O Link é um componente usado para criar links em um aplicativo React.
function SecondPage() { ... }
: Define o componente SecondPage como uma função que retorna um elemento JSX. O componente é definido aqui como uma função, mas também poderia ser definido como uma classe.
<div> ... </div>
: Cria um elemento div que contém o restante do conteúdo da página.
<p>Primeira Página</p>
: Cria um elemento p que contém o texto "Página Anterior".
<button type='button'> ... </button>
: Cria um botão que contém o link para a página anterior. O atributo type='button' define o tipo do botão como um botão normal, para evitar que a página seja recarregada quando o botão é clicado.
<Link to='/next'> ... </Link>
: Cria um componente Link com o texto "Página Anterior" e um atributo ##to## que especifica a rota da Página Anterior (/).
export default FirstPage
: Exporta o componente FirstPage como o componente padrão deste módulo. Isso permite que ele seja importado em outros arquivos do aplicativo usando import SecondPage from './secondPage'
.
// src/router.js
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import FirstPage from './pages/firstPage'
import SecondPage from './pages/secondPage'
function Router() {
return (
<BrowserRouter>
<Routes>
<Route exact path="/" element={<FirstPage />} />
<Route path="/next" element={<SecondPage />} />
</Routes>
</BrowserRouter>
);
}
export default Router
import { BrowserRouter, Routes, Route } from 'react-router-dom';
: Importa os componentes necessários do pacote react-router-dom. O BrowserRouter é um componente que envolve o aplicativo e fornece a funcionalidade de roteamento. O Routes é um componente que contém as rotas do aplicativo e o Route é um componente que define uma rota em si.
import FirstPage from './pages/firstPage'
: Importa o componente FirstPage do arquivo firstPage.js, que contém o código para a primeira página do aplicativo.
import SecondPage from './pages/secondPage'
: Importa o componente SecondPage do arquivo secondPage.js, que contém o código para a segunda página do aplicativo.
function Router() { ... }
: Define a função Router como um componente que retorna os elementos JSX que definem as rotas do aplicativo.
<BrowserRouter> ... </BrowserRouter>
: Envolve o aplicativo com o componente BrowserRouter para fornecer a funcionalidade de roteamento.
<Routes> ... </Routes>
: Define o elemento Routes, que contém todas as rotas do aplicativo.
<Route exact path="/" element={<FirstPage />} />
: Define uma rota para a página inicial (/) do aplicativo, que renderiza o componente FirstPage. O atributo exact garante que apenas a rota exata é correspondida. O atributo path define o caminho da rota.
<Route path="/next" element={<SecondPage />} />
: Define uma rota para a página seguinte (/next) do aplicativo, que renderiza o componente SecondPage. O atributo path define o caminho da rota.
export default Router: Exporta o componente Router como o componente padrão deste módulo. Isso permite que ele seja importado em outros arquivos do aplicativo usando import Router from './Router'
.
// src/App.js
import Router from './router'
function App() {
return (
<Router />
);
}
export default App;
import Router from './router'
: Importa o componente Router do arquivo router.js para definir as rotas do aplicativo.
function App() { ... }
: Define a função App como um componente que retorna os elementos JSX que compõem o aplicativo.
<Router />
: Renderiza o componente Router definido no arquivo router.js, que contém as rotas do aplicativo.
export default App;
: Exporta o componente App como o componente padrão deste módulo. Isso permite que ele seja importado em outros arquivos do aplicativo usando import App from './App'
.