O objetivo deste manual é fornecer instruções passo a passo que ajudarão você a aprender os principais conceitos do React.
Em vez de abordar todas as teorias e conceitos do React na íntegra, ensinarei os principais componentes da biblioteca. Você aprenderá sobre JSX, componentes, props, estados, manipuladores de eventos, criação de formulários e execução de solicitações de rede.
Índice
- Requisitos
- Capítulo 1: Introdução
- Configuração do computador
- Seu primeiro aplicativo React
- Explicando o código-fonte
- Capítulo 2: Como criar componentes React
- Como retornar vários elementos com fragmentos
- Como renderizar na tela
- Como escrever comentários no React
- Como compor vários componentes como um só
- Capítulo 3: Fazendo sentido do JSX
- Como renderizar uma lista usando JSX
- Como adicionar o atributo de classe
- Capítulo 4: Adereços e Estados
- Como Passar Vários Adereços
- Os adereços são imutáveis
- Estado em React
- Como passar o estado para um componente filho
- Como usar o React DevTools para inspecionar estados e propriedades
- Capítulo 5: Renderização Condicional do React
- Renderização parcial com uma variável regular
- Renderização em linha com o operador &&
- Renderização em linha com o operador condicional (ternário)
- Capítulo 6: Como lidar com eventos do usuário
- Como alterar a interface do usuário manipulando eventos
- Capítulo 7: CSS em React
- Estilo em linha do React
- Arquivos CSS
- Módulos CSS
- CSS do Tailwind
- Qual você deve usar?
- Capítulo 8: Como construir formulários em React
- Como lidar com a entrada do formulário
- Como lidar com o envio de formulários
- Como lidar com a validação de formulários
- Capítulo 9: Solicitações de rede no React
- O gancho useEffect
- Concluindo
Ao abordar esses conceitos, você estará preparado para se aprofundar em tópicos avançados do React.
Requisitos
Para aproveitar ao máximo este manual, você precisa ter conhecimentos básicos de HTML, CSS e JavaScript. Não é necessário conhecimento prévio de React, pois começaremos do básico.
Capítulo 1: Introdução
React é uma biblioteca front-end JavaScript muito popular. Ela recebeu muita atenção de desenvolvedores do mundo todo por sua simplicidade e desempenho rápido .
O React foi desenvolvido inicialmente pelo Facebook como uma solução para problemas de front-end que eles estavam enfrentando:
- A manipulação do DOM é uma operação cara e deve ser minimizada
- Não havia nenhuma biblioteca especializada em lidar com desenvolvimento front-end na época (existe o Angular, mas é um framework INTEIRO).
- Usar muito JavaScript puro pode transformar um aplicativo web em uma bagunça difícil de manter.
Por que os desenvolvedores adoram o React? Como desenvolvedor de software, posso pensar em alguns motivos pelos quais adoro o React:
- É minimalista . O React cuida de apenas UMA coisa: a interface do usuário e como ela muda de acordo com os dados que você insere. O React torna sua interface dinâmica com o mínimo de código.
- A curva de aprendizado é baixa . Os conceitos básicos do React são relativamente fáceis de aprender, e você não precisa de meses ou 40 horas de videoaulas para aprender o básico.
- Não é opinativo . O React pode ser integrado a diversas tecnologias diferentes. No front-end, você pode usar diferentes bibliotecas para lidar com chamadas Ajax (Axios, Superagent ou simplesmente Fetch). No back-end, você pode usar PHP/Ruby/Go/Python ou qualquer linguagem de sua preferência.
- Conta com forte apoio da comunidade . Para aprimorar os recursos do React, colaboradores de código aberto criaram um ecossistema incrível de bibliotecas que permite criar aplicativos ainda mais poderosos. Mas a maioria das bibliotecas de código aberto para React são opcionais. Você não precisa aprendê-las até dominar os fundamentos do React.
O ponto principal é que, com uma curva de aprendizado baixa, o React oferece um poder incrível para tornar sua interface de usuário flexível, reutilizável e sem complicações.
Aprender React abre enormes oportunidades se você quer trabalhar como desenvolvedor web.
Configuração do computador
Para começar a programar com React, você precisará ter três coisas:
- Um navegador da web
- Um editor de código
- Node.js
Usaremos o navegador Chrome para executar nosso código JavaScript, então, se você não o tiver, poderá baixá-lo aqui .
O navegador está disponível para todos os principais sistemas operacionais. Após a conclusão do download, instale o navegador no seu computador.
Em seguida, você precisará instalar um editor de código, caso ainda não tenha um. Existem vários editores de código gratuitos disponíveis na internet, como Sublime Text, Visual Studio Code e Notepad++.
Desses editores, meu favorito é o Visual Studio Code, porque é rápido e fácil de usar.
Como instalar o Visual Studio Code
O Visual Studio Code, ou VSCode, é um aplicativo criado com o propósito de escrever código. Além de ser gratuito, o VSCode é rápido e está disponível em todos os principais sistemas operacionais.
Você pode baixar o Visual Studio Code aqui .
Ao abrir o link acima, deverá aparecer um botão mostrando a versão compatível com seu sistema operacional, conforme mostrado abaixo:
Baixando o Visual Studio Code
Clique no botão para baixar o VSCode e instalá-lo no seu computador.
Agora que você tem um editor de código instalado, o próximo passo é instalar o Node.js
Como instalar o Node.js
Node.js é um aplicativo de tempo de execução JavaScript que permite executar JavaScript fora do navegador. Você precisa instalar este aplicativo no seu computador para instalar os pacotes necessários para o desenvolvimento em React.
Você pode baixar e instalar o Node.js em https://nodejs.org . Escolha a versão LTS recomendada, pois ela oferece suporte de longo prazo. O processo de instalação é bem simples.
Para verificar se o Node foi instalado corretamente, digite o comando abaixo na sua linha de comando (Prompt de Comando no Windows ou Terminal no Mac):
node -v
A linha de comando deve responder com a versão do Node.js que você tem no seu computador.
Seu primeiro aplicativo React
É hora de executar sua primeira aplicação React. Primeiro, crie uma pasta no seu computador que será usada para armazenar todos os arquivos relacionados a este livro. Você pode nomear a pasta "beginning_react".
O próximo passo é abrir seu terminal e executar o comando npm para criar um novo aplicativo React usando o Vite.
Vite (pronuncia-se "veet") é uma ferramenta de construção que você pode usar para inicializar um novo projeto React. Dentro da pasta "beginning_react", você precisa executar o seguinte comando para criar um novo projeto React com o Vite:
npm create vite@5.1.0 my-react-app -- --template react
Você deverá ver o npm solicitando a instalação de um novo pacote (create-vite), conforme mostrado abaixo. Prossiga digitando "y" e pressionando Enter:
Need to install the following packages:
create-vite@5.1.0
Ok to proceed? (y) y
Em seguida, o Vite criará um novo projeto React chamado 'my-react-app' da seguinte maneira:
Scaffolding project in /dev/beginning_react/my-react-app...
Done. Now run:
cd my-react-app
npm install
npm run dev
Quando terminar, siga os próximos passos mostrados na saída acima. Use o cd
comando para alterar o diretório de trabalho para o aplicativo que você acabou de criar e execute npm install
para instalar os pacotes necessários para o aplicativo.
Em seguida, você precisa executar o npm run dev
comando para iniciar seu aplicativo:
$ npm run dev
> my-react-app@0.0.0 dev
> vite
VITE v5.0.10 ready in 509 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h + enter to show help
Agora você pode visualizar o aplicativo em execução no navegador, no endereço localhost designado:
Página inicial do Vite-React
Isso significa que você criou seu primeiro aplicativo React com sucesso. Parabéns!
Explicando o código-fonte
Agora que você executou com sucesso um aplicativo React, vamos dar uma olhada no código-fonte gerado pelo Vite para entender como as coisas funcionam.
Execute o Visual Studio Code que você instalou na seção anterior e abra a pasta 'my-react-app' dentro do VSCode.
Aqui, você deverá ver várias pastas e arquivos que compõem o aplicativo React da seguinte maneira:
Estrutura do aplicativo Vite-React
Este vite.config.js
é um arquivo de configuração que instrui o Vite sobre como executar o aplicativo. Como temos um aplicativo React, você verá o plugin React importado dentro:
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
})
Quando você executa o npm run dev
comando, o Vite examinará esse arquivo para saber como executar o programa.
O package.json
arquivo armazena informações sobre o projeto, incluindo os pacotes necessários para executá-lo sem problemas. O package-lock.json
arquivo mantém um registro das versões dos pacotes instalados.
O .eslintrc.cjs
arquivo contém regras do ESLint. O ESLint é uma ferramenta de análise de código que pode identificar códigos problemáticos no seu projeto sem a necessidade de executá-lo. Ele relatará quaisquer erros e avisos no VSCode.
O index.html
arquivo é um documento HTML estático que será usado ao executar o aplicativo React e README.md
contém uma introdução ao projeto.
Você não precisa modificar nenhum desses arquivos. Em vez disso, vamos para a src/
pasta onde o código do aplicativo React está escrito.
src
├── App.css
├── App.jsx
├── assets
│ └── react.svg
├── index.css
└── main.jsx
Primeiro, o App.css
arquivo contém as regras CSS aplicadas ao App.jsx
arquivo, que é o código principal do aplicativo React.
A assets/
pasta contém os recursos necessários para este projeto. Neste caso, é o ícone do React, que você viu no navegador.
O index.css
arquivo é o arquivo CSS raiz aplicado globalmente ao aplicativo, e o main.jsx
arquivo raiz que acessa o index.html
arquivo para renderizar o aplicativo React. Aqui está o conteúdo do main.jsx
arquivo:
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.jsx'
import './index.css'
ReactDOM.createRoot(document.getElementById('root')).render(
<React.StrictMode>
<App />
</React.StrictMode>,
)
Aqui, você pode ver que a biblioteca ReactDOM cria uma raiz no <div>
elemento que contém o root
ID e, em seguida, renderiza todo o aplicativo React para esse elemento.
Você pode abrir o App.jsx
arquivo para visualizar o código React:
import { useState } from 'react'
import reactLogo from './assets/react.svg'
import viteLogo from '/vite.svg'
import './App.css'
function App() {
const [count, setCount] = useState(0)
return (
<>
<div>
<a href="https://vitejs.dev" target="_blank">
<img src={viteLogo} className="logo" alt="Vite logo" />
</a>
<a href="https://react.dev" target="_blank">
<img src={reactLogo} className="logo react" alt="React logo" />
</a>
</div>
<h1>Vite + React</h1>
<div className="card">
<button onClick={() => setCount((count) => count + 1)}>
count is {count}
</button>
<p>
Edit <code>src/App.jsx</code> and save to test HMR
</p>
</div>
<p className="read-the-docs">
Click on the Vite and React logos to learn more
</p>
</>
)
}
export default App
Neste arquivo, um único componente chamado App
é definido. Os logotipos Vite e React são renderizados com um link para a respectiva biblioteca, e há um botão de contador que incrementará o contador em 1 ao clicar nele.
Este arquivo é onde exploraremos os fundamentos do React. Vamos apagar tudo neste arquivo e escrever um App
componente simples que renderiza um <h1>
elemento:
function App() {
return <h1>Hello World</h1>
}
export default App
Em seguida, exclua as pastas index.css
, app.css
e assets/
. Você também precisa excluir a import './index.css'
instrução do seu main.jsx
arquivo.
Se você abrir o navegador novamente, deverá ver um único título renderizado da seguinte maneira:
Saída do React a partir de alterações no código
Certo! Agora você está pronto para aprender os fundamentos do React. Começaremos sua primeira lição no próximo capítulo.
Capítulo 2: Como criar componentes React
No React, um componente é uma unidade independente de uma interface de usuário (IU). O que você escreve dentro de um componente determinará o que deve aparecer na tela do navegador em um determinado momento.
No capítulo anterior, criamos um App
componente que retorna um elemento de título:
function App() {
return <h1>Hello World</h1>
}
export default App
Um componente é composto por uma função que retorna um único elemento de interface do usuário.
Quando você deseja que um componente não renderize nada, você pode retornar um null
ou false
em vez de um elemento.
function App() {
return null
}
Todos os componentes do React são salvos na .jsx
extensão de arquivo . Como você pode ver neste projeto, você tem main.jsx
e App.jsx
.
O que é JSX? É uma extensão do JavaScript que produz elementos HTML baseados em JavaScript. Aprenderemos mais sobre isso mais tarde.
Como retornar vários elementos com fragmentos
Um componente deve sempre retornar um único elemento. Quando você precisa retornar vários elementos, é necessário envolvê-los em um único elemento, como <div>
:
function App() {
return (
<div>
<h1>Hello World!</h1>
<h2>Learning to code with React</h2>
</div>
)
}
export default App
Mas isso fará com que seu aplicativo renderize um <div>
elemento extra no navegador. Para evitar bagunçar seu aplicativo, você pode renderizar uma tag vazia <>
como esta:
function App() {
return (
<>
<h1>Hello World!</h1>
<h2>Learning to code with React</h2>
</>
)
}
export default App
A tag vazia acima é um recurso do React chamado Fragmento. Ao usar um Fragmento, seu componente não renderizará um elemento extra na tela.
Você também pode importar o Fragment
módulo do React para torná-lo explícito da seguinte maneira:
import { Fragment } from 'react';
function App() {
return (
<Fragment>
<h1>Hello World!</h1>
<h2>Learning to code with React</h2>
</Fragment>
)
}
export default App
Mas você não precisa declarar a Fragment
tag explicitamente. Usar uma tag vazia <>
é suficiente.
Como renderizar na tela
Para renderizar um componente React no navegador, você precisa criar um componente React raiz usando a biblioteca ReactDOM, que você viu anteriormente ao visualizar o main.jsx
arquivo.
Você precisa ter um arquivo HTML como a fonte a partir da qual seu componente React será renderizado.
Normalmente, um documento HTML muito básico com um <div>
é suficiente, como você pode ver no index.html
arquivo:
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
Em seguida, você renderiza o componente no <div>
elemento.
Observe como o ReactDOM é importado do react-dom
pacote e document.getElementById('root')
é usado para selecionar o <div>
elemento abaixo:
import React from 'react'
import ReactDOM from 'react-dom/client'
function App() {
return <h1>Hello World!</h1>
}
ReactDOM.createRoot(document.getElementById('root')).render(
<React.StrictMode>
<App />
</React.StrictMode>,
)
Aqui, você pode ver que o App
componente está localizado no mesmo arquivo que a biblioteca ReactDOM. Você pode fazer isso se quiser remover o App.jsx
arquivo, para que tenha apenas um único main.jsx
arquivo como fonte para o seu aplicativo React.
Mas é confuso ter vários componentes em um arquivo, então não vamos fazer isso.
Como escrever comentários no React
Escrever comentários em componentes React é semelhante a comentar em código JavaScript comum. Você pode usar a sintaxe de barra dupla //
para comentar qualquer código.
O exemplo a seguir mostra como comentar a export
declaração:
function App() {
return (
<>
<h1>Hello World!</h1>
<h2>Learning to code with React</h2>
</>
)
}
// export default App
Quando você quiser comentar o código dentro da return
instrução, você precisa usar o formato de chaves, barra e asterisco, {/* comment here */}
conforme mostrado abaixo:
function App() {
return (
<>
<h1>Hello World!</h1>
{/* <h2>Learning to code with React</h2> */}
</>
)
}
Pode parecer muito chato ter que se lembrar de duas maneiras diferentes de comentar ao escrever aplicativos React. Mas não se preocupe, porque uma ferramenta moderna como o VSCode sabe como gerar a sintaxe de comentário correta.
Você só precisa pressionar o atalho de comentário, que é CTRL + /
para Windows/Linux ou Command + /
macOS.
Como compor vários componentes como um só
Até este ponto, você renderizou apenas um App
componente para o navegador. Mas aplicativos criados com React podem ser compostos por dezenas ou centenas de componentes.
A composição de componentes é o processo de formação da interface do usuário utilizando componentes fracamente acoplados. É como construir uma casa com blocos de Lego, como mostrarei no exemplo a seguir:
export default function ParentComponent() {
return (
<>
<UserComponent />
<ProfileComponent />
<FeedComponent />
</>
);
}
function UserComponent() {
return <h1> User Component </h1>;
}
function ProfileComponent() {
return <h1> Profile Component </h1>;
}
function FeedComponent() {
return <h1> Feed Component</h1>;
}
No exemplo acima, você pode ver como o <ParentComponent>
renderiza três componentes filhos:
<UserComponent>
<ProfileComponent>
<FeedComponent>
A composição de muitos componentes formará uma única árvore de componentes React em uma abordagem de cima para baixo.
A árvore será então renderizada no DOM através do ReactDOM.render()
método:
Árvore de componentes do React ilustrada
Ao compor vários componentes, você pode dividir a interface do usuário em partes independentes e reutilizáveis, e desenvolver cada parte isoladamente.
Capítulo 3: Fazendo sentido do JSX
No capítulo anterior, você aprendeu que um componente sempre deve ter uma return
instrução que contenha elementos a serem renderizados na tela:
function App() {
return <h1>Hello World</h1>
}
A tag <h1>
parece uma tag HTML comum, mas na verdade é uma linguagem de modelo especial incluída no React chamada JSX.
JSX é uma extensão de sintaxe que produz elementos HTML baseados em JavaScript. Ela pode ser atribuída a variáveis JavaScript e pode ser retornada de chamadas de função. Por exemplo:
function App() {
const myElement = <h1>Hello World</h1>
return myElement
}
Graças ao JSX, você também pode incorporar expressões JavaScript dentro de um elemento usando chaves {}
:
const lowercaseClass = 'text-lowercase';
const text = 'Hello World!';
const App = <h1 className={lowercaseClass}>{text}</h1>;
É isso que diferencia os elementos React dos elementos HTML. Não é possível incorporar JavaScript diretamente usando chaves em HTML.
Em vez de criar uma linguagem de modelagem totalmente nova, você só precisa usar funções JavaScript para controlar o que está sendo exibido na tela.
Como renderizar uma lista usando JSX
Por exemplo, digamos que você tenha uma série de usuários que gostaria de mostrar:
const users = [
{ id: 1, name: 'Nathan', role: 'Web Developer' },
{ id: 2, name: 'John', role: 'Web Designer' },
{ id: 3, name: 'Jane', role: 'Team Leader' },
]
Você pode usar a map()
função para fazer um loop no array:
function App() {
const users = [
{ id: 1, name: 'Nathan', role: 'Web Developer' },
{ id: 2, name: 'John', role: 'Web Designer' },
{ id: 3, name: 'Jane', role: 'Team Leader' },
]
return (
<>
<p>The currently active users list:</p>
<ul>
{
users.map(function(user){
// returns Nathan, then John, then Jane
return (
<li> {user.name} as the {user.role} </li>
)
})
}
</ul>
</>
)
}
No React, você não precisa armazenar o valor de retorno da map()
função em uma variável. O exemplo acima retornará um <li>
elemento para cada valor de array no componente.
Embora o código acima já esteja completo, o React disparará um erro no console, dizendo que você precisa colocar uma propriedade "key" em cada filho de uma lista (o elemento que você retorna da map()
função):
Aviso de 'chave' do React no console do navegador
Uma prop (abreviação de propriedade) é uma entrada que você pode passar para um componente ao renderizá-lo. A key
prop é uma prop especial que o React usará para determinar qual elemento filho foi alterado, adicionado ou removido da lista.
Você não o utilizará ativamente em nenhuma parte do código de renderização do seu array, mas o React solicitará um quando você renderizar uma lista.
É recomendável que você coloque o identificador exclusivo dos seus dados como o valor da chave. No exemplo acima, você pode usar os user.id
dados. Veja como passar uma key
propriedade para cada <li>
elemento:
return (
<li key={user.id}>
{user.name} as the {user.role}
</li>
)
Quando você não tem nenhum identificador exclusivo para sua lista, você pode usar o index
valor da matriz como último recurso:
users.map(function(user, index){
return (
<li key={index}>
{user.name} as the {user.role}
</li>
)
})
Props são um dos ingredientes que tornam um componente React poderoso. Você aprenderá mais sobre isso no próximo capítulo.
Como adicionar o atributo de classe
Você pode adicionar o class
atributo aos seus elementos usando a className
palavra-chave:
function App() {
return <h1 className='text-lowercase'>Hello World!</h1>
}
A palavra-chave class
é reservada para classes JavaScript, então você precisa usar className
.
Capítulo 4: Adereços e Estados
Props e estados são usados para passar dados dentro de componentes React. Props (ou propriedades) são entradas passadas de um componente pai para seu componente filho.
Por outro lado, estados são variáveis definidas e gerenciadas dentro dos componentes.
Vamos começar entendendo props. Suponha que você tenha um ParentComponent
que renderiza algo ChildComponent
como isto:
function ParentComponent() {
return <ChildComponent />
}
Você pode passar uma propriedade de ParentComponent
para ChildComponent
adicionando um novo atributo após o nome do componente.
No código abaixo, a name
propriedade com o valor 'John' é passada para ChildComponent
:
function ParentComponent() {
return <ChildComponent name='John' />
}
Quando o componente for renderizado no navegador, ele ChildComponent
receberá o nome prop no componente.
Você pode acessar o props
objeto definindo-o no argumento do componente de função:
function ChildComponent(props){
return <p>Hello World! my name is {props.name}</p>
}
O props
parâmetro sempre será um objeto, e qualquer prop que você definir ao renderizar o componente será passado como uma propriedade para o objeto.
Como Passar Vários Adereços
Você pode passar quantos props quiser para um único componente filho. Basta adicionar os props ao usar o componente, conforme mostrado abaixo:
function ParentComponent() {
return (
<ChildComponent
name="John"
age={29}
hobbies={["read books", "drink coffee"]}
occupation="Software Engineer"
/>
)
}
Todos os adereços acima serão passados para o props
parâmetro do ChildComponent.
Você pode até passar uma função para props como esta:
function ParentComponent() {
function greetings() {
return 'Hello World'
}
return <ChildComponent greetings={greetings} />
}
No componente filho, você pode chamar a função da seguinte maneira:
function ChildComponent(props) {
return <p>{props.greetings()}</p>
}
Observe que se você passar qualquer coisa diferente de uma string como valor prop, você precisa colocar o valor entre chaves (números, funções, matrizes, objetos e assim por diante)
Isso ocorre porque expressões JavaScript não podem ser processadas pelo JSX, a menos que você coloque a expressão entre chaves.
Os adereços são imutáveis
Imutável significa que o valor de um objeto não pode ser alterado, não importa o que aconteça.
No código abaixo, ele ChildComponent
tenta alterar o valor da props.name
propriedade:
function ChildComponent(props){
props.name = 'Mark';
return <p>Hello World! my name is {props.name}</p>
}
function ParentComponent() {
return <ChildComponent name='John'/>
}
export default ParentComponent
Mas você receberá um erro no console como o seguinte:
Uncaught TypeError: Cannot assign to read only property 'name' of object '#<Object>'
Como você pode ver, as propriedades do React não podem ser alteradas depois de declaradas. Mas e se seus dados precisarem ser alterados conforme o usuário interage com o aplicativo? É aí que o estado entra em ação.
Estado em React
No React, estados são dados arbitrários que você pode declarar e gerenciar em seus componentes. Para criar um estado no React, você precisa chamar o useState
hook conforme mostrado abaixo:
import { useState } from 'react'
function ParentComponent() {
const [name, setName] = useState('John')
}
export default ParentComponent
No React, ganchos são funções que permitem que você explore os recursos oferecidos pelo React. O useState
gancho é uma função que permite que você atribua valor ao mecanismo de estado.
Ao chamar a useState()
função, você pode passar um argumento que servirá como valor inicial do estado. A função então retorna um array com dois elementos.
O primeiro elemento contém o valor do estado, e o segundo elemento é uma função que permite alterar o valor do estado. Você precisa usar a sintaxe de array de desestruturação para receber ambos os elementos, conforme mostrado acima.
Você pode dar qualquer nome às variáveis retornadas por useState
, mas é recomendado usar [something, setSomething]
.
Para renderizar o valor do estado, você pode incorporá-lo ao JSX da seguinte maneira:
function ParentComponent() {
const [name, setName] = useState('John')
return <h1>Hello {name}</h1>
}
Se você quiser alterar o valor da name
variável, precisará usar a setName()
função fornecida.
Mas você não pode chamar setName()
o corpo do componente, porque o React será atualizado sempre que você alterar o valor do estado.
Em vez disso, você pode criar um botão que alterará o valor do nome quando você clicar nele:
function ParentComponent() {
const [name, setName] = useState('John')
return (
<>
<h1>Hello {name}</h1>
<button onClick={() => setName('Mark')}>Change Name</button>
</>
)
}
No código acima, criamos um <button>
elemento e adicionamos o onClick
prop, que é executado sempre que clicamos no botão.
Dentro do prop, passamos uma função que simplesmente chama a setName()
função, alterando o valor do estado.
Como passar o estado para um componente filho
Você pode passar o estado para qualquer componente filho. Quando precisar atualizar o estado de um componente filho, você precisa passar a setSomething
função recebida do useState
hook.
Aqui está um exemplo de passagem de um estado de ParentComponent
para ChildComponent
:
function ParentComponent() {
const [name, setName] = useState('John')
return <ChildComponent name={name} setName={setName} />
}
No ChildComponent
, você pode chamar a setName()
função props
assim:
function ChildComponent(props) {
return (
<>
<h1>Hello {props.name}</h1>
<button onClick={() => props.setName('Mark')}>Change Name</button>
</>
)
}
Ao clicar no botão ChildComponent
, o valor do name
estado será alterado. Internamente, o React atualizará o aplicativo e refletirá as alterações na interface do usuário.
Como usar o React DevTools para inspecionar estados e propriedades
Para ajudar a facilitar seu desenvolvimento, você pode instalar o React Developer Tools (DevTools para abreviar) para inspecionar o estado atual e o valor das propriedades dos seus componentes.
Você pode instalar o React DevTool para Chrome aqui .
Após a instalação, abra a ferramenta do desenvolvedor e você deverá ter duas abas extras chamadas Componentes e Profiler , conforme mostrado abaixo:
Abrindo o React DevTool
Semelhante à forma como você pode inspecionar regras CSS aplicadas a elementos HTML, você pode inspecionar o estado e as propriedades dos componentes React usando as ferramentas do desenvolvedor. Clique na aba Componentes e inspecione um dos dois componentes que criamos anteriormente.
Abaixo, você pode ver os adereços e o estado do ParentComponent
, bem como outros detalhes:
Inspecionando componentes com React DevTool
Ao clicar no botão, o valor do estado será alterado de acordo. Você pode inspecionar ChildComponent
para ver seus detalhes. Estas DevTools serão úteis ao desenvolver aplicativos React.
Capítulo 5: Renderização Condicional do React
Você pode controlar qual saída está sendo renderizada por um componente implementando a renderização condicional no seu código JSX.
Por exemplo, digamos que você queira alternar entre a renderização dos botões de login e logout, dependendo da disponibilidade do user
estado:
function App(props) {
const { user } = props
if (user) {
return <button>Logout</button>
}
return <button>Login</button>
}
export default App
Você não precisa adicionar uma else
instrução no componente porque o React interromperá outros processos quando atingir uma return
instrução.
No exemplo acima, o React renderizará o botão de logout quando o user
valor for truey, e o botão de login quando user
for falsey.
Renderização parcial com uma variável regular
Ao desenvolver com React, haverá casos em que você desejará renderizar uma parte da sua interface do usuário dinamicamente em um componente.
No exemplo abaixo, o elemento JSX é armazenado em uma variável chamada button
, e essa variável é usada novamente na return
instrução:
function App(props) {
const { user } = props
let button = <button>Login</button>
if (user) {
button = <button>Logout</button>
}
return (
<>
<h1>Hello there!</h1>
{button}
</>
)
}
Em vez de escrever duas instruções de retorno, você armazena o elemento dinâmico da interface do usuário dentro de uma variável e usa essa variável na return
instrução.
Dessa forma, você pode ter um componente que possui elementos estáticos e dinâmicos.
Renderização em linha com o &&
operador
É possível renderizar um componente somente se uma determinada condição for atendida e renderizá-lo nulo caso contrário.
Por exemplo, digamos que você queira renderizar uma mensagem dinâmica para usuários quando eles tiverem novos e-mails na caixa de entrada:
function App() {
const newEmails = 2
return (
<>
<h1>Hello there!</h1>
{newEmails > 0 &&
<h2>
You have {newEmails} new emails in your inbox.
</h2>
}
</>
)
}
Neste exemplo, o <h2>
elemento só é renderizado quando a newEmails
contagem é maior que 0.
Renderização em linha com o operador condicional (ternário)
Também é possível usar um operador ternário para renderizar a interface do usuário dinamicamente.
Veja o exemplo a seguir:
function App(props) {
const { user } = props
return (
<>
<h1>Hello there!</h1>
{ user? <button>Logout</button> : <button>Login</button> }
</>
)
}
Em vez de usar uma variável para armazenar o <button>
elemento, você pode simplesmente usar o operador ternário no user
valor e renderizar o botão 'Logout' ou 'Login' de acordo com o valor da variável.
Capítulo 6: Como lidar com eventos do usuário
Por dentro, o React tem um manipulador de eventos interno que se conecta ao evento DOM nativo.
É por isso que podemos adicionar o onClick
suporte aos botões nos capítulos anteriores, que é executado em resposta a um evento de clique.
Quando você chama uma função em resposta a eventos, o event
objeto será passado para a função de retorno de chamada da seguinte maneira:
function App() {
const handleClick = (event) => {
console.log("Hello World!");
console.log(event);
}
return (
<button onClick={handleClick}>
Click me
</button>
)
}
Ao clicar no botão acima, a event
variável será registrada como um SyntheticBaseEvent
objeto no seu console:
Log de eventos SyntheticBase do React
O SyntheticBaseEvent
objeto é um objeto React integrado usado para interagir com os eventos nativos do DOM. Diferentes navegadores têm diferentes implementações do objeto de evento DOM, o que SyntheticBaseEvent
torna o React compatível com esses navegadores.
Sempre que um evento DOM for acionado, esse evento sintético será manipulado pelo React para que você possa decidir o que fazer com ele.
O caso de uso para este evento sintético é o mesmo do evento DOM nativo. Três dos manipuladores de eventos mais comuns que você usará são:
onChange
onClick
onSubmit
Você pode responder às interações do usuário, como clicar, passar o mouse, focar ou digitar em uma entrada de formulário, enviar um formulário e assim por diante.
Como alterar a interface do usuário manipulando eventos
No capítulo anterior, você viu como a lógica condicional pode ser usada para renderizar diferentes saídas.
Ao combinar lógica condicional com estado, propriedades e manipuladores de eventos, você pode criar um componente dinâmico que renderiza diferentes saídas com base nos dados que ele contém no momento.
Por exemplo, digamos que você queira mostrar ou ocultar um <div>
elemento com um clique de botão. Veja como fazer isso:
import { useState } from 'react';
function App() {
// State to hold the visibility status of the paragraph
const [isParagraphVisible, setIsParagraphVisible] = useState(true);
// Function to toggle the visibility status of the paragraph
const toggleStatus = () => {
setIsParagraphVisible(!isParagraphVisible);
};
return (
<>
<h1>Change UI based on click</h1>
{isParagraphVisible && (
<p>This paragraph will be shown/hidden on click</p>
)}
<button onClick={toggleStatus}>
{isParagraphVisible ? 'Hide' : 'Show'} Paragraph
</button>
</>
);
}
export default App;
Primeiro, você cria um estado para manter o status de visibilidade do parágrafo usando o useState
gancho. O valor padrão do estado é true
.
Em seguida, uma função chamada toogleStatus()
é definida. Esta função alterará o status
valor de true
para false
e vice-versa.
Por fim, uma return
instrução é adicionada para renderizar os elementos na tela. Ao clicar no botão, a toogleStatus()
função será executada. Isso mostrará ou ocultará o parágrafo dependendo do status atual.
Ao usar estados, propriedades e manipuladores de eventos, o código que você escreve se torna uma descrição de como a interface do usuário deve ser. O React então pega essa descrição e a renderiza no navegador.
Capítulo 7: CSS em React
Há quatro maneiras comuns de adicionar CSS em um aplicativo React:
- Estilo em linha
- Arquivos CSS
- Módulos CSS
- CSS do Tailwind
Este capítulo explorará essas quatro maneiras diferentes de escrever CSS em componentes React e qual delas você deve usar ao iniciar um aplicativo React.
Estilo em linha do React
Os componentes React são compostos por elementos JSX. Mas só porque você não está escrevendo elementos HTML comuns não significa que não possa usar o antigo método de estilo inline.
A única diferença com JSX é que os estilos inline devem ser escritos como um objeto em vez de uma string. Veja o exemplo abaixo:
function App() {
return (
<h1 style={{ color: 'red' }}>Hello World</h1>
);
}
No atributo de estilo acima, o primeiro conjunto de chaves é usado para escrever expressões JavaScript. O segundo conjunto de chaves inicializa um objeto JavaScript.
Nomes de propriedades de estilo com mais de uma palavra são escritos em camelCase em vez do estilo tradicional hifenizado. Por exemplo, a text-align
propriedade usual é escrita como textAlign
em JSX:
function App() {
return (
<h1 style={{ textAlign: 'center' }}>Hello World</h1>
);
}
Como o atributo style é um objeto, você também pode separar o estilo escrevendo-o como uma constante. Dessa forma, você pode reutilizá-lo em outros elementos, conforme necessário:
const pStyle = {
fontSize: '16px',
color: 'blue'
}
export default function App() {
return (
<>
<p style={pStyle}>Hello World!</p>
<p style={pStyle}>The weather is sunny today.</p>
</>
)
}
Se precisar estender seu estilo de parágrafo ainda mais, você pode usar o operador de propagação.
Isso permitirá que você adicione estilos embutidos ao objeto de estilo já declarado. Veja o <p>
elemento abaixo:
const pStyle = {
fontSize: '16px',
color: 'blue'
}
export default function App() {
return (
<p style={{ ...pStyle, color: 'green', textAlign: 'right' }}>
When you go to work, bring your umbrella with you!
</p>
)
}
Os estilos embutidos do JSX permitem que você escreva CSS diretamente no seu componente.
Uma das vantagens de usar a abordagem de estilo em linha é que você terá uma técnica de estilo simples e focada em componentes. Ao usar um objeto para estilização, você pode estender seu estilo espalhando o objeto.
Mas em um projeto grande e complexo, onde você tem centenas de componentes React para gerenciar, esta pode não ser a melhor escolha para você.
Não é possível especificar pseudoclasses usando estilos embutidos. Isso significa que não é possível definir regras como :hover
, :focus
, :active
, e assim por diante.
Além disso, você não pode especificar consultas de mídia para estilo responsivo. Vamos considerar outra maneira de estilizar seu aplicativo React.
Arquivos CSS
Outra maneira de adicionar CSS no React é usar .css
arquivos. O Vite já sabe como lidar com um .css
arquivo, então tudo o que você precisa fazer é importar o arquivo CSS para o seu arquivo JSX e adicionar a className
propriedade correta ao seu componente.
Vamos criar um style.css
arquivo na pasta do seu projeto com o seguinte conteúdo:
/* style.css */
.paragraph-text {
font-size: 16px;
color: #ff0000;
}
Agora, vamos importar o arquivo CSS para o App.jsx
arquivo e adicionar a propriedade class ao componente:
import './style.css';
function App() {
return (
<p className="paragraph-text">
The weather is sunny today.
</p>
);
}
Dessa forma, o CSS será separado dos seus arquivos JavaScript, e você poderá escrever a sintaxe CSS normalmente.
Você pode até incluir um framework CSS como o Bootstrap no React com essa abordagem. Tudo o que você precisa fazer é importar o arquivo CSS para o seu componente raiz.
Este método permitirá que você use todos os recursos do CSS, incluindo pseudoclasses e consultas de mídia.
Módulos CSS
Um módulo CSS é um arquivo CSS comum com todos os seus nomes de classes e animações com escopo local por padrão.
Ao aplicar esse método, cada componente React terá seu próprio arquivo CSS, e você precisará importar esse arquivo CSS para seu componente.
Para que o React saiba que você está usando módulos CSS, nomeie seu arquivo CSS usando a [name].module.css
convenção.
Aqui está um exemplo:
/* App.module.css */
.BlueParagraph {
color: blue;
text-align: left;
}
.GreenParagraph {
color: green;
text-align: right;
}
Em seguida, importe-o para seu arquivo de componente:
import styles from "./App.module.css";
function App() {
return (
<>
<p className={styles.BlueParagraph}>
The weather is sunny today.
</p>
<p className={styles.GreenParagraph}>
Still, don't forget to bring your umbrella!
</p>
</>
)
}
Ao criar seu aplicativo, o Vite procurará automaticamente por arquivos CSS que tenham o .module.css
nome e processará os nomes das classes para um novo nome localizado.
O uso de módulos CSS garante que suas classes CSS tenham escopo local, evitando que as regras CSS colidam umas com as outras.
Outra vantagem de usar Módulos CSS é que você pode compor uma nova classe herdando de outras classes que você escreveu. Dessa forma, você poderá reutilizar código CSS que escreveu anteriormente, como este:
.MediumParagraph {
font-size: 20px;
}
.BlueParagraph {
composes: MediumParagraph;
color: blue;
text-align: left;
}
.GreenParagraph {
composes: MediumParagraph;
color: green;
text-align: right;
}
Mas não vamos explorar todos os recursos dos módulos CSS aqui, apenas o suficiente para você se familiarizar com eles.
CSS do Tailwind
Tailwind CSS é um framework CSS moderno e utilitário que permite estilizar elementos combinando diversas classes.
Frameworks CSS como Bootstrap e Bulma fornecem componentes de alto nível que você pode usar imediatamente no seu projeto. Quando precisar estilizar um botão, basta aplicar as classes que contêm as propriedades CSS desejadas:
<button className="btn btn-primary">Subscribe</button>
Ao usar o Bootstrap, a btn
classe fornece uma combinação de propriedades CSS, como preenchimento, cor, opacidade, espessura da fonte e assim por diante.
Por outro lado, o Tailwind oferece classes utilitárias onde cada classe tem apenas uma ou duas propriedades:
<button className='px-5 py-2 text-white bg-blue-500 border-2'>
Subscribe
</button>
No exemplo acima, "the" px-5
é a abreviação de "padding" padding-left
e padding-right
", enquanto 5 é um tamanho específico para os "paddings". " text-white
Aplica" color: white
, " bg-blue-500
aplica a background-color
propriedade" e border
"aplica" border-width
.
Qual você deve usar?
Depende do método com o qual você se sente mais confortável. Se estiver trabalhando em equipe, é preciso discutir e concordar sobre o método que deseja aplicar, pois misturar estilos dificulta o desenvolvimento e a manutenção da aplicação.
Lembre-se: sempre use apenas uma maneira de estilizar componentes React em um projeto específico para evitar confusão.
Capítulo 8: Como construir formulários em React
Uma das interfaces mais comuns que você criará como desenvolvedor web é um formulário. No React, você pode criar um formulário usando o estado como a única fonte de dados desse formulário.
Neste capítulo, mostrarei como lidar com a entrada, o envio e a validação de formulários usando o React.
Como lidar com a entrada do formulário
Por exemplo, suponha que você queira criar um formulário com uma única entrada de texto e um botão.
Você pode primeiro configurar o estado que servirá como valor de entrada:
import { useState } from 'react';
function Form() {
const [username, setUsername] = useState();
}
Em seguida, adicione a return
instrução e defina o formulário. No <input>
elemento, atribua o username
estado como value
prop:
import { useState } from 'react';
function Form() {
const [username, setUsername] = useState();
return (
<form>
Username:
<input type='text' name='username' value={username} />
</form>
);
}
Em seguida, adicione a onChange
propriedade ao <input>
elemento. Nessa propriedade, atribua o valor value
da entrada de texto como o valor do username
estado:
import { useState } from 'react';
function Form() {
const [username, setUsername] = useState();
return (
<form>
Username:
<input
type='text'
value={username}
onChange={e => setUsername(e.target.value)}
/>
</form>
);
}
O objeto e
or event
é passado pela onChange
propriedade para a função de retorno de chamada. A partir desse objeto, podemos obter o valor do texto de entrada na event.target.value
propriedade.
Agora, sempre que o valor de entrada mudar, o estado será atualizado para refletir as alterações.
Como lidar com o envio de formulários
O próximo passo é enviar o formulário. Vamos criar uma função que manipula o evento de envio, chamado handleSubmit()
da seguinte forma:
import { useState } from 'react';
function Form() {
const [username, setUsername] = useState();
const handleSubmit = (e) => {
e.preventDefault();
alert(username);
}
return (
<form onSubmit={handleSubmit}>
Username:
<input
type='text'
value={username}
onChange={(e) => setUsername(e.target.value)}
/>
<button>Submit</button>
</form>
);
}
Aqui, a handleSubmit()
função interromperá o comportamento padrão de envio do formulário, o que acionará uma atualização e, em seguida, criará uma caixa de alerta para exibir o username
valor.
A função é então passada para a onSubmit
propriedade do <form>
elemento. Um atributo A <button>
também é adicionado para que o usuário possa enviar o formulário.
Como lidar com a validação de formulários
Para lidar com a validação do formulário, você precisa criar outro estado que armazenará a mensagem de erro. Você pode nomear esse estado usernameError
da seguinte forma:
const [usernameError, setUsernameError] = useState();
Em seguida, crie uma handleUsername()
função que será executada quando a username
entrada for alterada.
Dentro desta função, você pode chamar a setUsername()
função para atualizar o estado e, em seguida, escrever a lógica para validar o valor de entrada.
Por exemplo, suponha que o username
comprimento deve ser maior que 6. Veja como fazer isso:
const handleUsername = e => {
const { value } = e.target;
setUsername(value);
// Validate username value:
if (value.length <= 6) {
setUsernameError('Username length must be more than 6 characters');
} else {
setUsernameError();
}
};
Agora que você tem alguma lógica de validação, precisa definir a handleUsername()
função como o onChange
manipulador de propriedades.
Além disso, adicione um parágrafo abaixo do <input>
elemento que mostrará a mensagem de erro da seguinte maneira:
return (
<form onSubmit={handleSubmit}>
Username:
<input type='text' value={username} onChange={handleUsername} />
<p>{usernameError}</p>
<button>Submit</button>
</form>
);
Dentro da handleSubmit()
função, você pode verificar se há um erro no formulário verificando o usernameError
estado e, em seguida, impedir que o formulário seja enviado quando houver um erro:
const handleSubmit = (e) => {
e.preventDefault();
if(usernameError){
alert('Unable to submit: Form contain errors');
} else {
alert(username);
}
}
Dessa forma, o formulário não será enviado até que o erro seja corrigido.
Aqui está o código-fonte completo do formulário, caso você queira experimentá-lo:
import { useState } from 'react';
function App() {
const [username, setUsername] = useState();
const [usernameError, setUsernameError] = useState();
const handleSubmit = (e) => {
e.preventDefault();
if(usernameError){
alert('Unable to submit: Form contain errors');
} else {
alert(username);
}
}
const handleUsername = e => {
const { value } = e.target;
setUsername(value);
// Validate username value:
if (value.length <= 6) {
setUsernameError('Username length must be more than 6 characters');
} else {
setUsernameError();
}
};
return (
<form onSubmit={handleSubmit}>
Username:
<input
type='text'
value={username}
onChange={handleUsername}
/>
<p>{usernameError}</p>
<button>Submit</button>
</form>
);
}
export default App;
Um formulário pode ser tão complexo ou simples quanto necessário, mas você usará o padrão que vê aqui, não importa o formulário que criar:
- Os valores de estado são usados como fonte de dados de formulário e validação
onChange
prop como forma de atualizar o estado- As validações são acionadas por entradas do usuário
- Uma
handleSubmit()
função é executada quando o formulário é enviado
Usando esses blocos de construção, você pode criar qualquer formulário necessário para seu aplicativo.
Capítulo 9: Solicitações de rede no React
Os aplicativos web modernos tendem a ter uma arquitetura modular, onde o back-end é separado do front-end. O aplicativo front-end precisará enviar uma solicitação de rede HTTP para um endpoint remoto.
O React não informa como você deve enviar solicitações de rede. A biblioteca se concentra apenas na renderização da interface do usuário com gerenciamento de dados usando propriedades e estados.
Para buscar dados usando o React, você pode usar qualquer biblioteca JavaScript válida, como Axios, Superagent e até mesmo a API Fetch nativa.
Neste capítulo, veremos como fazer solicitações de rede usando o Fetch no React.
O gancho useEffect
Ao criar um aplicativo React que precisa ser sincronizado com um sistema fora do React, você precisa usar o useEffect
hook.
Este gancho permite que você execute algum código após a renderização para que você possa sincronizar seu componente com algum sistema fora do React.
Quando o gancho terminar de executar a solicitação de dados, você poderá definir a resposta nos estados do componente e renderizar os componentes apropriados com base nos valores do estado.
Para mostrar um exemplo, vamos buscar dados de https://jsonplaceholder.typicode.com/todos/1 , que é um ponto final fictício:
function App() {
const [title, setTitle] = useState('');
useEffect(() => {
getData();
}, []);
const getData = async () => {
const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
const task = await response.json();
console.log(task)
setTitle(task.title);
};
return <h1>{title}</h1>;
}
No código acima, criamos um App
componente que tem um estado chamado title
e executamos a Fetch API para obter uma tarefa a fazer da API.
Quando uma resposta é recebida, analisamos a string JSON em um objeto JavaScript, registramos o objeto e, em seguida, definimos o title
estado para o task.title
valor da propriedade.
A resposta é a seguinte:
Log de uso de efeitos do React
Aqui, você pode ver que o console.log()
é chamado duas vezes. Isso ocorre porque o <React.StrictMode>
wrapper sempre executa um useEffect
hook duas vezes para ajudar no desenvolvimento.
Se você remover o <React.StrictMode>
wrapper em main.jsx
, o useEffect
gancho será executado apenas uma vez.
O useEffect
gancho em si é uma função que aceita dois argumentos:
- Uma função de retorno de chamada para executar em cada renderização
- Uma série de variáveis de estado para observar alterações.
useEffect
será ignorada se nenhuma das variáveis for atualizada.
Quando você deseja executar useEffect
apenas uma vez, você pode passar um array vazio como o segundo argumento para a função, como mostrado no exemplo acima.
Ao usar o useEffect
gancho, o React pode enviar solicitações HTTP e buscar dados de qualquer sistema externo e, em seguida, armazenar esses dados no estado do componente.
Concluindo
Parabéns por terminar este manual! Espero que você o tenha achado útil e agora sinta que aprender React não é impossível nem confuso. Tudo o que você precisa é de um guia passo a passo que revele os principais conceitos do React, um por um.
Se você está ansioso para se aprofundar no React e expandir suas habilidades, recomendo que confira meu novo livro chamado Beginning React aqui:
O objetivo deste livro é ajudar você a ver como criar um aplicativo usando React. Há dois projetos incluídos neste livro que lhe darão a "experiência" de criar um aplicativo web usando React.
Você verá como conceitos do React, como componentes, JSX, props, estados, hooks e Context API são usados para criar um aplicativo front-end dinâmico.
Aqui está minha promessa: você realmente se sentirá confiante ao criar aplicativos web do zero usando React.