Atividade 16: Entendendo o Estado (useState)
Bem-vindo ao coração do React! Aprenda a criar telas vivas que reagem e mudam dados em tempo real.
🎯 Objetivos desta aula
- ✓ Compreender a diferença entre Variáveis Normais VS Variáveis de Estado
-
✓
Aprender a importar e utilizar o Hook
useState() - ✓ Desvendar a mágica do Re-Render (Re-desenho) automático da tela
🪫 O Limite das Variáveis Normais
Muitos iniciantes tentam mudar um texto na tela criando uma variável let nome = "João"
e atrelando-a a um botão que faz nome = "Maria". O código roda silenciosamente, a
variável muda sua essência na memória do celular... Mas a tela nunca
atualiza! Pra quem está olhando o App, ainda está escrito "João".
Isso acontece porque as telas do React são míopes. Elas leem a Variável apenas 1 vez (quando a tela
abre e diz Render). Se mudarmos a variável comum depois, o React
não fica
vigiando-a pra gastar bateria a toa. Conclusão: não há Re-Render (Re-desenho). O App se
congela visualmente no momento do nascimento!
⚠️ O Modo Errado (Não Funciona visualmente)
let nomeHeroi = 'Batman';
function mudarNome() {
nomeHeroi = 'Superman';
console.log(nomeHeroi); // No terminal imprime 'Superman'. Mas a Tela CONTINUA MOSTRANDO BATMAN PRA SEMPRE!
}
🔋 A Mágica do Estado (State)
O State é uma variável vigiada. Ao criar uma variável com o
useState, o React coloca um "sininho" nela. Se você a alterar,
o sino toca. O sistema leva um choque e fala: "OPA! A Variável mudou!! Destrua toda a
Interface Velha e Redesenhe O BURACO DO MEU APLICATIVO DO ZERO COM A PALAVRA NOVA!". A
tela ganha vida! E isso leva milésimos se segundo graças ao C++.
Nós criamos e controlamos as variáveis Mágias usando a ferramenta-Hook chamada
useState. Nós declaramos ela trazendo Duas Coisas e
Uma Caixa Gêmeas Encadeadas :
const [ nome, setNome ] = useState( 'Batman' );
- nome: A Variável Mágica em si, que pode ser lida em `{nome}` normalmente.
- setNome: A FERRAMENTA DE TROCA DE ROUPA (Função). O React PROIBE você de usar o sinal de igual `=` para alterar a variável. O único poder que pode alterá-la e tocar o Sino de re-renderização do App é usar o Set() nela inteira!
- useState('Batman'): Dentro dos parênteses redondos declaramos o conteúdo 'padrão/inicial' do berço da variável para o momento em que a página carregar a primeira vez!
💻 Exemplo Quebrando Feitiços
Olhe a anatomia da variável de Estado real em React Native:
import React, { useState } from 'react'; // IMPORTANTE O IMPORT DO HOOK DO REACT E NÃO REACT NATIVE!
import { View, Text, Button } from 'react-native';
export default function App() {
// 1. Criamos o Estado dentro do Corpo Funcional Base
const [heroi, setHeroi] = useState('Batman');
// 2. A Função Alteradora Exclusiva
function mudarHeroi() {
// É PROIBIDO FAZER: heroi = 'Superman'
// Jeito CORRETO (Invocar o Set passando a palavra inteira para alertar ao O.S iOS/Android)
setHeroi('Superman');
}
// 3. O Render Base da Função que será Atualizado Dinamicamente Injeta o Valor em Bigodes!
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text style={{ fontSize: 30, marginBottom: 20 }}>
Herói Atual: {heroi}
</Text>
<Button title="Eu sou o Menino de Aço!" onPress={mudarHeroi} />
</View>
);
}
🎮 Desafios Práticos
Aperte as Chaves de Fenda das Variáveis e brinque no Expo Snack!
Modificar 🛠️
- Copie o código base e jogue no Snack do Expo.
- Modifique primeiro o valor dentro de `useState('Batman')` para o seu próprio nome! Veja que ao recarregar a primeira inicialização será a SUA.
- Tente adicionar um segundo botão chamdo "Sou do Asilo Arkham" e crie uma função "voltarBatman" que invoca `setHeroi('Coringa')`. E alterne a tela entre os 2!
Tipos de Variaveis Diferentes (Quebrando o Molde) ✨
Crie um Booleano do zero!.
- Crie de cabeça uma estrutura de useState chamada [ligado, setLigado] e faça seu valor incial (Dentro de useState) ser o Booleano `false` cru (SEM ASPAS POIS NÃO É STRING)!
- Tente fazer um Render Dinâmico condicional como Text da última aula:
{ ligado ? 'LUZ VIVA!' : 'ESCURO...' }. - Se conseguir, tente fazer um botão que puxe `setLigado(true)`.