Nesta aula estudaremos como criar uma estrutura de sistema em ReactJs
Para criar uma aplicação React, vamos acessar o site https://create-react-app.dev/
Vamos instalar o React utilizando o npx, que é um arquivo binário que lê os arquivos que são colocados no arquivo package.json, para saber os arquivos que existem na pasta node_module e assim executar algumas bibliotecas.
O npx é um auxiliar do npm que vem junto na instalação do npm para auxiliar na criação de aplicaticos e execuções de scripts dentro do node.js.
Vamos utilizar o npx para mostrar como criar aplicação.
npx create-react-app my-app
cd my-app
npm start
Após a instalação, a estrutura de arquivos abaixo será criada:
O arquivo yarn.lock possui as versões dos pacotes que estamos utilizando no momento da instalação da aplicação.
No arquivo package.json temos todas as dependências e alguns scripts:
"dependencies": {
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^13.0.0",
"@testing-library/user-event": "^13.2.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.0"
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
Temos o arquivo .gitignore, que vai fazer com que, ao enviarmos os arquivos para o git, os arquivos abaixos sejam ignorados:
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# production
/build
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
O arquivo favicon.ico, insere um ícone na aplicação,através da tag head o arquivo index.html
< !DOCTYPE html>
< html lang="en">
< head>
< link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
< /head>
< body>
< /body>
< /html>
Arquivo index.html possui algumas tags como a tag meta que declara o viewport adaptando a aplicação para que seja responsiva
< !DOCTYPE html>
< html lang="en">
< head>
< meta charset="utf-8" />
< meta name="viewport" content="width=device-width, initial-scale=1" />
< title>React Torne-se um programador< /title>
< /head>
< body>
< /body>
< /html>
A div com o id=root é onde tudo vai acontecer.
Todo HTML será inserido nesta tag. Lembrando que o Javascript Vanilla terá um document.getElementById deste root, que usará um innerHtml enviando todo HTML que foi feito build da nossa aplicação js em cima deste root.
< div id="root">< /div>
O arquivo App.css é onde podemos inserir o estilo da página, podemos também importar arquivos css.
.App {
text-align: center;
}
.App-logo {
height: 40vmin;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
}
.App-header {
background-color: #282c34;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.App-link {
color: #61dafb;
}
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
O arquivo App.js é basicamente um componente que vamos introduzí-lo no arquivo index.js.
import React from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
return (
< div className="App">
< header className="App-header">
< img src={logo} className="App-logo" alt="logo" />
< p>
Edit < code>src/App.js< /code> com o torne-se um programador.
< /p>
< a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
< /a>
< /header>
< /div>
);
}
export default App;
O arquivo index.js é o principal da aplicação, que vai fazer o import dos arquivos.Lembrando que ele está fazendo o import graças a função do webpack ou do babel, ou seja, terá a função de importar, dar opção de termos esses dados e depois fazer a tradução de acordo com a versão do EcmaScript que iremos utilizar. Normalmente compila na versão EcmaScript 5, que praticamente todo o tipo de browser irá funcionar.
A aplicação react será renderizada dentro do root.
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import serviceWorker from './serviceWorker';
ReactDOM.render(
< React.StrictMode>
< App />
< /React.StrictMode>,
document.getElementById('root')
);
// 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
serviceWorker.unregister();
Vamos executar a aplicação utilizando o comando:
yarn start
O próximo passo será utilizar componentes, então vamos modularizar algumas partes do nosso HTML, ou seja, vamos trazer a estrutura do header,body e footer em componentes separados.
No arquivo App.js, vamos retirar a tag header, o import do logo e o import do css, para iniciar a componentização do header. Por enquanto o arquivo ficará somente com a tag div, para não dar erro de renderização.
import React from 'react';
function App() {
return (
< div className="App">
< /div>
);
}
export default App;
Para começar a criar nosso componente header, vamos acessar o site do bootstrap para copiar a tag nav da página inicial do bootstrap:
Vamos colar e ajustar o código fonte da tag nav no nosso app. Ficará com o código abaixo:
import React from 'react';
function App() {
return (
< div className="App">
< header className="navbar navbar-expand-lg bd-navbar sticky-top">
< nav className="container-xxl bd-gutter flex-wrap flex-lg-nowrap" aria-label="Main navigation">
< div className="offcanvas-lg offcanvas-end flex-grow-1" tabindex="-1" id="bdNavbar" aria-labelledby="bdNavbarOffcanvasLabel" data-bs-scroll="true">
< div className="offcanvas-body p-4 pt-0 p-lg-0">
< hr className="d-lg-none text-white-50">< /hr>
< ul className="navbar-nav flex-row flex-wrap bd-navbar-nav">
< li className="nav-item col-6 col-lg-auto">
< a className="nav-link py-2 px-0 px-lg-2" href="/home" >Home< /a>
< /li>
< li className="nav-item col-6 col-lg-auto">
< a className="nav-link py-2 px-0 px-lg-2" href="/clientes" >Clientes< /a>
< /li>
< /ul>
< /div>
< /div>
< /nav>
< /header>
< /div>
);
}
export default App;
Vamos inserir, abaixo do return, o link absoluto para importar o css da tag nav que acabamos de copiar:
Link relativo do css:
< link href="/docs/5.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-aFq/bzH65dt+w6FI2ooMVUpc+21e0SRygnTpmBvdBgSdnuTN7QbdgL+OapgHtvPp" crossorigin="anonymous">< /link>
Substituir pelo endereço absoluto do css:
< link href="/https://getbootstrap.com/docs/5.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-aFq/bzH65dt+w6FI2ooMVUpc+21e0SRygnTpmBvdBgSdnuTN7QbdgL+OapgHtvPp" crossorigin="anonymous">< /link>
Ficará assim:
import React from 'react';
function App() {
return (
< link href="https://getbootstrap.com/docs/5.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-aFq/bzH65dt+w6FI2ooMVUpc+21e0SRygnTpmBvdBgSdnuTN7QbdgL+OapgHtvPp" crossorigin="anonymous">< /link>
);
}
export default App;
Agora vamos construir o componente Header, criando um novo arquivo chamado Header.js, dentro da pasta src:
Vamos alterar a função para uma classe chamada Header e o export default Header.
Iremos também fazer o import do Component:
import React, { Component } from 'react';
class Header extends Component {
render() {
return < header className="navbar navbar-expand-lg bd-navbar sticky-top">
< link href="https://getbootstrap.com/docs/5.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-aFq/bzH65dt+w6FI2ooMVUpc+21e0SRygnTpmBvdBgSdnuTN7QbdgL+OapgHtvPp" crossorigin="anonymous">< /link>
< nav className="container-xxl bd-gutter flex-wrap flex-lg-nowrap" aria-label="Main navigation">
< div className="offcanvas-lg offcanvas-end flex-grow-1" tabindex="-1" id="bdNavbar" aria-labelledby="bdNavbarOffcanvasLabel" data-bs-scroll="true">
< div className="offcanvas-body p-4 pt-0 p-lg-0">
< hr className="d-lg-none text-white-50">< /hr>
< ul className="navbar-nav flex-row flex-wrap bd-navbar-nav">
< li className="nav-item col-6 col-lg-auto">
< a className="nav-link py-2 px-0 px-lg-2" href="/home" >Home< /a>
< /li>
< li className="nav-item col-6 col-lg-auto">
< a className="nav-link py-2 px-0 px-lg-2" href="/clientes" >Clientes< /a>
< /li>
< /ul>
< /div>
< /div>
< /nav>
< /header>
}
}
export default Header;
No arquivo App.js, iremos apagar a tag header, e agora inserir o componente Header que foi criado.
Faremos também o import do componente Header e o menu nav funcionará corretamente.
import React from 'react';
import Header from './Header';
function App() {
return (
< Header> < /Header>
);
}
export default App;
Para criar nosso componente Body, vamos acessar o site do bootstrap para copiar a tag main da página inicial do bootstrap:
Vamos colar e ajustar o código fonte da tag main no nosso app. Podemos deixar somente poucos trechos e apagar grande parte do que foi copiado, para simplificar o processo.
Fazendo os ajustes, o arquivo Body.js ficará parecido com o código abaixo:
import React, { Component } from 'react';
class Body extends Component {
render() {
return < main className="col-lg-7 mb-5">
< h2 className="display-5 mb-3 fw-semibold lh-sm">App com ReactJS< /h2>
< p className="lead fw-normal">
Uma aplicação criada em ReactJS com torne-se um programador.
< /p>
< /main>
};
}
export default Body;
No arquivo App.js, faremos também o import do componente Body.
import React from 'react';
import Header from './Header';
import Body from './Body';
function App() {
return (
< div>
< Header> < /Header>
< Body> < /Body>
< /div>
);
}
export default App;
Para criar nosso componente Footer, vamos acessar o site do bootstrap para copiar a tag footer da página inicial do bootstrap:
O arquivo Footer.js ficará parecido com o código abaixo:
import React, { Component } from 'react';
class Footer extends Component {
render() {
return < footer className="bd-footer py-4 py-md-5 mt-5 bg-body-tertiary">
< div className="col-6 col-lg-2 offset-lg-1 mb-3">
< h5>Links< /h5>
< ul className="list-unstyled">
< li className="mb-2">< a href="/">Home< /a>< /li>
< li className="mb-2">< a href="/docs/5.3/">Clientes< /a>< /li>
< li className="mb-2">< a href="/docs/5.3/examples/">Examples< /a>< /li>
< /ul>
< /div>
< /footer>
};
}
export default Footer;
No arquivo App.js, faremos também o import do componente Footer.
import React from 'react';
import Header from './Header';
import Body from './Body';
import Footer from './Footer';
function App() {
return (
< div>
< Header> < /Header>
< Body> < /Body>
< Footer> < /Footer>
< /div>
);
}
export default App;
Nesta aula estudaremos como criar uma estrutura de sistema em ReactJs
Para criar uma aplicação React, vamos acessar o site https://create-react-app.dev/
Vamos instalar o React utilizando o npx, que é um arquivo binário que lê os arquivos que são colocados no arquivo package.json, para saber os arquivos que existem na pasta node_module e assim executar algumas bibliotecas.
O npx é um auxiliar do npm que vem junto na instalação do npm para auxiliar na criação de aplicaticos e execuções de scripts dentro do node.js.
Vamos utilizar o npx para mostrar como criar aplicação.
npx create-react-app my-app
cd my-app
npm start
Após a instalação, a estrutura de arquivos abaixo será criada:
O arquivo yarn.lock possui as versões dos pacotes que estamos utilizando no momento da instalação da aplicação.
No arquivo package.json temos todas as dependências e alguns scripts:
"dependencies": {
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^13.0.0",
"@testing-library/user-event": "^13.2.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.0"
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
Temos o arquivo .gitignore, que vai fazer com que, ao enviarmos os arquivos para o git, os arquivos abaixos sejam ignorados:
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# production
/build
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
O arquivo favicon.ico, insere um ícone na aplicação,através da tag head o arquivo index.html
< !DOCTYPE html>
< html lang="en">
< head>
< link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
< /head>
< body>
< /body>
< /html>
Arquivo index.html possui algumas tags como a tag meta que declara o viewport adaptando a aplicação para que seja responsiva
< !DOCTYPE html>
< html lang="en">
< head>
< meta charset="utf-8" />
< meta name="viewport" content="width=device-width, initial-scale=1" />
< title>React Torne-se um programador< /title>
< /head>
< body>
< /body>
< /html>
A div com o id=root é onde tudo vai acontecer.
Todo HTML será inserido nesta tag. Lembrando que o Javascript Vanilla terá um document.getElementById deste root, que usará um innerHtml enviando todo HTML que foi feito build da nossa aplicação js em cima deste root.
< div id="root">< /div>
O arquivo App.css é onde podemos inserir o estilo da página, podemos também importar arquivos css.
.App {
text-align: center;
}
.App-logo {
height: 40vmin;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
}
.App-header {
background-color: #282c34;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.App-link {
color: #61dafb;
}
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
O arquivo App.js é basicamente um componente que vamos introduzí-lo no arquivo index.js.
import React from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
return (
< div className="App">
< header className="App-header">
< img src={logo} className="App-logo" alt="logo" />
< p>
Edit < code>src/App.js< /code> com o torne-se um programador.
< /p>
< a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
< /a>
< /header>
< /div>
);
}
export default App;
O arquivo index.js é o principal da aplicação, que vai fazer o import dos arquivos.Lembrando que ele está fazendo o import graças a função do webpack ou do babel, ou seja, terá a função de importar, dar opção de termos esses dados e depois fazer a tradução de acordo com a versão do EcmaScript que iremos utilizar. Normalmente compila na versão EcmaScript 5, que praticamente todo o tipo de browser irá funcionar.
A aplicação react será renderizada dentro do root.
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import serviceWorker from './serviceWorker';
ReactDOM.render(
< React.StrictMode>
< App />
< /React.StrictMode>,
document.getElementById('root')
);
// 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
serviceWorker.unregister();
Vamos executar a aplicação utilizando o comando:
yarn start
O próximo passo será utilizar componentes, então vamos modularizar algumas partes do nosso HTML, ou seja, vamos trazer a estrutura do header,body e footer em componentes separados.
No arquivo App.js, vamos retirar a tag header, o import do logo e o import do css, para iniciar a componentização do header. Por enquanto o arquivo ficará somente com a tag div, para não dar erro de renderização.
import React from 'react';
function App() {
return (
< div className="App">
< /div>
);
}
export default App;
Para começar a criar nosso componente header, vamos acessar o site do bootstrap para copiar a tag nav da página inicial do bootstrap:
Vamos colar e ajustar o código fonte da tag nav no nosso app. Ficará com o código abaixo:
import React from 'react';
function App() {
return (
< div className="App">
< header className="navbar navbar-expand-lg bd-navbar sticky-top">
< nav className="container-xxl bd-gutter flex-wrap flex-lg-nowrap" aria-label="Main navigation">
< div className="offcanvas-lg offcanvas-end flex-grow-1" tabindex="-1" id="bdNavbar" aria-labelledby="bdNavbarOffcanvasLabel" data-bs-scroll="true">
< div className="offcanvas-body p-4 pt-0 p-lg-0">
< hr className="d-lg-none text-white-50">< /hr>
< ul className="navbar-nav flex-row flex-wrap bd-navbar-nav">
< li className="nav-item col-6 col-lg-auto">
< a className="nav-link py-2 px-0 px-lg-2" href="/home" >Home< /a>
< /li>
< li className="nav-item col-6 col-lg-auto">
< a className="nav-link py-2 px-0 px-lg-2" href="/clientes" >Clientes< /a>
< /li>
< /ul>
< /div>
< /div>
< /nav>
< /header>
< /div>
);
}
export default App;
Vamos inserir, abaixo do return, o link absoluto para importar o css da tag nav que acabamos de copiar:
Link relativo do css:
< link href="/docs/5.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-aFq/bzH65dt+w6FI2ooMVUpc+21e0SRygnTpmBvdBgSdnuTN7QbdgL+OapgHtvPp" crossorigin="anonymous">< /link>
Substituir pelo endereço absoluto do css:
< link href="/https://getbootstrap.com/docs/5.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-aFq/bzH65dt+w6FI2ooMVUpc+21e0SRygnTpmBvdBgSdnuTN7QbdgL+OapgHtvPp" crossorigin="anonymous">< /link>
Ficará assim:
import React from 'react';
function App() {
return (
< link href="https://getbootstrap.com/docs/5.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-aFq/bzH65dt+w6FI2ooMVUpc+21e0SRygnTpmBvdBgSdnuTN7QbdgL+OapgHtvPp" crossorigin="anonymous">< /link>
);
}
export default App;
Agora vamos construir o componente Header, criando um novo arquivo chamado Header.js, dentro da pasta src:
Vamos alterar a função para uma classe chamada Header e o export default Header.
Iremos também fazer o import do Component:
import React, { Component } from 'react';
class Header extends Component {
render() {
return < header className="navbar navbar-expand-lg bd-navbar sticky-top">
< link href="https://getbootstrap.com/docs/5.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-aFq/bzH65dt+w6FI2ooMVUpc+21e0SRygnTpmBvdBgSdnuTN7QbdgL+OapgHtvPp" crossorigin="anonymous">< /link>
< nav className="container-xxl bd-gutter flex-wrap flex-lg-nowrap" aria-label="Main navigation">
< div className="offcanvas-lg offcanvas-end flex-grow-1" tabindex="-1" id="bdNavbar" aria-labelledby="bdNavbarOffcanvasLabel" data-bs-scroll="true">
< div className="offcanvas-body p-4 pt-0 p-lg-0">
< hr className="d-lg-none text-white-50">< /hr>
< ul className="navbar-nav flex-row flex-wrap bd-navbar-nav">
< li className="nav-item col-6 col-lg-auto">
< a className="nav-link py-2 px-0 px-lg-2" href="/home" >Home< /a>
< /li>
< li className="nav-item col-6 col-lg-auto">
< a className="nav-link py-2 px-0 px-lg-2" href="/clientes" >Clientes< /a>
< /li>
< /ul>
< /div>
< /div>
< /nav>
< /header>
}
}
export default Header;
No arquivo App.js, iremos apagar a tag header, e agora inserir o componente Header que foi criado.
Faremos também o import do componente Header e o menu nav funcionará corretamente.
import React from 'react';
import Header from './Header';
function App() {
return (
< Header> < /Header>
);
}
export default App;
Para criar nosso componente Body, vamos acessar o site do bootstrap para copiar a tag main da página inicial do bootstrap:
Vamos colar e ajustar o código fonte da tag main no nosso app. Podemos deixar somente poucos trechos e apagar grande parte do que foi copiado, para simplificar o processo.
Fazendo os ajustes, o arquivo Body.js ficará parecido com o código abaixo:
import React, { Component } from 'react';
class Body extends Component {
render() {
return < main className="col-lg-7 mb-5">
< h2 className="display-5 mb-3 fw-semibold lh-sm">App com ReactJS< /h2>
< p className="lead fw-normal">
Uma aplicação criada em ReactJS com torne-se um programador.
< /p>
< /main>
};
}
export default Body;
No arquivo App.js, faremos também o import do componente Body.
import React from 'react';
import Header from './Header';
import Body from './Body';
function App() {
return (
< div>
< Header> < /Header>
< Body> < /Body>
< /div>
);
}
export default App;
Para criar nosso componente Footer, vamos acessar o site do bootstrap para copiar a tag footer da página inicial do bootstrap:
O arquivo Footer.js ficará parecido com o código abaixo:
import React, { Component } from 'react';
class Footer extends Component {
render() {
return < footer className="bd-footer py-4 py-md-5 mt-5 bg-body-tertiary">
< div className="col-6 col-lg-2 offset-lg-1 mb-3">
< h5>Links< /h5>
< ul className="list-unstyled">
< li className="mb-2">< a href="/">Home< /a>< /li>
< li className="mb-2">< a href="/docs/5.3/">Clientes< /a>< /li>
< li className="mb-2">< a href="/docs/5.3/examples/">Examples< /a>< /li>
< /ul>
< /div>
< /footer>
};
}
export default Footer;
No arquivo App.js, faremos também o import do componente Footer.
import React from 'react';
import Header from './Header';
import Body from './Body';
import Footer from './Footer';
function App() {
return (
< div>
< Header> < /Header>
< Body> < /Body>
< Footer> < /Footer>
< /div>
);
}
export default App;