Componentes e Ciclo de Vida no React | [SIS]ANO2C3B2S8A2
[ SIS ] ANO2C3B2S8A2·Unidade 2 · Componente 3 · Semana 8·Ensino Médio Técnico — Desenvolvimento de Sistemas

ComponentDidMount, ComponentDidUpdate, ComponentWillUnmount — e os hooks que transformaram essa lógica em useEffect. Entenda o que acontece nos bastidores de cada componente React.

ReactHooks LifecycleuseEffect SEDUC-SPUserTracker

Por que componentes que funcionam isoladamente quebram quando integrados?

Um componente React que exibe dados de uma API funciona perfeitamente no teste local. Em produção, ele é montado e desmontado conforme o usuário navega. Se o código não gerencia o ciclo de vida corretamente, uma requisição assíncrona pode tentar atualizar um componente que já foi removido do DOM — gerando o temido erro Can't perform a React state update on an unmounted component. Isso não é bug de sintaxe. É falta de controle do ciclo de vida.

Entender quando um componente nasce, quando atualiza e quando morre no React não é detalhe avançado — é o fundamento que separa interfaces que não vazam memória daquelas que degradam progressivamente em produção.

Custo concreto de ignorar o ciclo de vida: timers não cancelados, subscriptions não removidas e requisições assíncronas em componentes desmontados são as principais causas de memory leaks em aplicações React em produção. Um componente sem componentWillUnmount adequado pode consumir memória indefinidamente.

Como o ciclo de vida funciona em três fases distintas?

Todo componente React passa por três fases durante sua existência no Virtual DOM. Cada fase tem métodos específicos para executar código no momento exato necessário — seja para buscar dados, reagir a mudanças ou limpar recursos.

fase 1 · montagem

componentDidMount

Executado uma vez logo após o componente ser inserido no DOM. Momento ideal para buscar dados de APIs, inicializar subscriptions e configurar timers.

fase 2 · atualização

componentDidUpdate

Executado após cada re-render causado por mudança em state ou props. Comparar estado anterior com atual evita loops infinitos de atualização.

fase 3 · desmontagem

componentWillUnmount

Executado antes de o componente ser removido do DOM. Essencial para cancelar timers, remover event listeners e desconectar subscriptions — evitar memory leaks.

≡ definição · ciclo de vida de componente React

Conjunto de métodos executados em fases específicas da existência de um componente: montagem (inserção no DOM), atualização (mudança em state/props) e desmontagem (remoção do DOM). Controla quando efeitos colaterais são disparados e limpos.

Como mapear os métodos de classe para hooks modernos?

FASECOMPONENTE DE CLASSEHOOK EQUIVALENTEQUANDO EXECUTAR
MontagemcomponentDidMount()useEffect(() => {}, [])Uma vez, após inserção no DOM — buscar dados, inicializar
AtualizaçãocomponentDidUpdate(prevProps, prevState)useEffect(() => {}, [dep])Quando dependência específica muda — sincronizar dados externos
DesmontagemcomponentWillUnmount()useEffect(() => { return () => {} }, [])Antes da remoção do DOM — cancelar timers, remover listeners
Toda renderizaçãocomponentDidUpdate() sem comparaçãouseEffect(() => {})Após cada render — usar com cuidado, risco de loop infinito

Como implementar o ciclo de vida no projeto UserTracker?

UserList.js — componente com os três métodos de ciclo de vida

UserList.js — ciclo de vida completo
import React, { Component } from 'react';

class UserList extends Component {
  constructor(props) {
    super(props);
    this.state = { users: [] }; // lista vazia na inicialização
  }

  // FASE 1 — MONTAGEM: executado uma vez após inserção no DOM
  componentDidMount() {
    this.setState({ users: ['Alice', 'Bob', 'Charlie'] });
  }

  // FASE 2 — ATUALIZAÇÃO: executado após cada mudança de state/props
  componentDidUpdate(prevProps, prevState) {
    if (prevState.users !== this.state.users) {
      console.log('Usuários atualizados:', this.state.users);
    }
  }

  // FASE 3 — DESMONTAGEM: executado antes da remoção do DOM
  componentWillUnmount() {
    console.log('Desmontando componente, limpando dados...');
  }

  render() {
    return (
      <div>
        <h1>Usuários Online:</h1>
        <ul>
          {this.state.users.map((user, index) => (
            <li key={index}>{user}</li>
          ))}
        </ul>
      </div>
    );
  }
}

export default UserList;

Equivalente moderno com useEffect

UserList.jsx — versão hooks (moderno)
import { useState, useEffect } from 'react';

function UserList() {
  const [users, setUsers] = useState([]);

  useEffect(() => {
    // componentDidMount: [] = executa apenas uma vez
    setUsers(['Alice', 'Bob', 'Charlie']);

    // componentWillUnmount: função de cleanup retornada
    return () => {
      console.log('Desmontando, limpando dados...');
    };
  }, []); // ← array vazio = executa só na montagem

  // componentDidUpdate: [users] = executa quando users muda
  useEffect(() => {
    console.log('Usuários atualizados:', users);
  }, [users]);

  return (
    <ul>
      {users.map((u, i) => <li key={i}>{u}</li>)}
    </ul>
  );
}
Lista de dependências — o controle central do useEffect: omitir o array executa o efeito após toda renderização (risco de loop). Array vazio [] executa apenas na montagem (equivalente ao componentDidMount). Array com variáveis [dep] executa quando qualquer dependência muda. O return de cleanup é executado antes da desmontagem e antes de cada reexecução do efeito.

Como esse conhecimento aparece no projeto UserTracker?

! caso real · projeto UserTracker — ciclo de vida na prática

Painel de monitoramento de usuários em tempo real

O projeto simula um painel que monitora usuários online. O ciclo de vida controla exatamente o que acontece em cada fase:

  • componentDidMount: ao montar, carrega a lista inicial — simula conexão com servidor.
  • componentDidUpdate: ao atualizar, registra a mudança no console — em produção, sincronizaria com WebSocket.
  • componentWillUnmount: ao desmontar, limpa dados e simula desconexão — previne memory leak se o usuário navegar para outra página.
→ expansão estratégica · 4 frentes

De aula de ciclo de vida a ativo pedagógico e profissional

{ }Curso Técnico

Evoluir UserTracker para buscar dados reais de uma API pública (JSONPlaceholder, GitHub Users). Adicionar WebSocket para atualização em tempo real com useEffect.

Blog / Autoridade

Artigo “Os 3 erros de ciclo de vida que todo dev React comete no primeiro emprego” — memory leaks, loops infinitos e cleanup incompleto.

[ ]Cultura Maker

Projeto integrado: painel de monitoramento do laboratório de informática — quais computadores estão em uso, timers de uso, alertas por tempo máximo.

>_Formação Docente

Oficina: como ensinar ciclo de vida sem servidor — simular fases com setTimeout e console.log visível no browser DevTools em tempo real.

Síntese: ComponentDidMount executa código após montagem na tela. ComponentDidUpdate monitora e responde às mudanças em state e props. ComponentWillUnmount limpa recursos ao remover o componente da árvore. Com hooks, useEffect unifica as três fases com controle preciso via lista de dependências.

Perguntas frequentes sobre ciclo de vida no React

O que é o ciclo de vida de um componente React?
O ciclo de vida descreve as três fases de existência de um componente: montagem (quando é inserido no DOM), atualização (quando state ou props mudam) e desmontagem (quando é removido do DOM). Cada fase tem métodos para executar código no momento certo.
Qual a diferença entre ComponentDidMount e useEffect?
ComponentDidMount é um método de classe executado uma vez após a montagem. useEffect com array vazio [] equivale ao mesmo comportamento em componentes funcionais. Em projetos modernos, useEffect substituiu os três métodos de ciclo de vida de classe.
O que é o hook useState no React?
useState é um hook que permite gerenciar o estado de um componente funcional. Recebe o valor inicial e retorna um array com o valor atual e a função setter. Toda chamada ao setter dispara re-render do componente.
Qual é a função principal do hook useEffect?
useEffect executa efeitos colaterais após a renderização — chamadas de API, subscriptions, manipulação do DOM, timers. A lista de dependências controla quando o efeito deve ser reexecutado.
O que acontece quando você omite a lista de dependências no useEffect?
Sem lista de dependências, useEffect é executado após cada renderização do componente. Isso pode causar loops infinitos se o efeito também alterar state. Sempre declare as dependências explicitamente para controle preciso.

Acesse todos os materiais do Curso Técnico

Slides, roteiros de projeto, hooks avançados e reflexões sobre ensino de React na escola pública.

→ professorcomia.com.br

Ciclo de vida como consciência do tempo em interfaces reativas

Dominar o ciclo de vida não é memorizar nomes de métodos — é internalizar que componentes React são entidades temporárias que existem, mudam e morrem. O desenvolvedor que entende esse ciclo escreve código que não vaza memória, não dispara efeitos acidentais e não quebra quando o usuário navega de forma inesperada. É o que separa uma interface que funciona no protótipo de uma que sobrevive aos usuários reais.

// código da aula: [SIS]ANO2C3B2S8A2 · unidade 2 · componente 3 · semana 8
// componentes e ciclo de vida no react · frameworks e bibliotecas javascript · seduc-sp
// publicado em: professorcomia.com.br · diariodeumpoed.com.br · poed · 2024

>_ slides da aula

[SIS]ANO2C3B2S8A2 · componentes e ciclo de vida no react · 2º ano · semana 8 · aula 2

slide 01
abertura

>_ Frameworks e Bibliotecas JavaScript — Aula 2

FREQUÊNCIA — registre sua presença no AVA antes de iniciar
  • Código: [SIS]ANO2C3B2S8A2 — Unidade 2 · Componente 3 · Semana 8
  • Continuando: na aula anterior vimos componentes, props, state e JSX — agora vamos aprender o que acontece no ciclo de existência de cada componente
  • Projeto desta aula: UserTracker — painel de monitoramento de usuários em tempo real
? pergunta provocadora — antes de qualquer slide Imagine um chat em que você abre e fecha a janela de conversa várias vezes. O que você acha que React precisa fazer quando a janela é aberta? E quando é fechada? Esse “início” e “fim” tem um nome — você sabe qual é?
slide 02
objetivos

[ ] O que vamos construir hoje

conceitual

Compreender as três fases do ciclo de vida de componentes React — montagem, atualização e desmontagem — e os métodos de cada fase.

procedimental

Implementar o projeto UserTracker com componentDidMount, componentDidUpdate e componentWillUnmount em um componente de classe.

atitudinal

Desenvolver curiosidade ao explorar como componentes React “nascem”, “vivem” e “morrem” — e o que pode dar errado em cada fase.

≡ recursos · laboratório de informática · Node.js + npm (ou StackBlitz) · caderno · 50 minutos
slide 03
problema_gerador

! O componente que não para de rodar

sem controle de ciclo de vida

Um componente inicia um timer ao ser exibido. O usuário navega para outra página — o componente some da tela. O timer continua rodando em background, atualizando state de um componente que não existe mais. Resultado: memory leak silencioso e erro no console.

com componentWillUnmount

O mesmo timer é cancelado no método componentWillUnmount — executado automaticamente antes da remoção do DOM. Nenhum recurso desperdiçado. Nenhum erro. O componente vive e morre de forma controlada.

? 5 minutos — no caderno Pense em aplicativos que você usa: notificações, mensagens em tempo real, localização GPS. Quando você fecha o app, o que você espera que aconteça com esses processos em background? React precisa lidar com exatamente isso.
slide 04
conceito

As 3 fases do ciclo de vida React

  • Montagem (mounting): componente é inserido no DOM — componentDidMount executa uma vez, ideal para buscar dados e inicializar recursos
  • Atualização (updating): state ou props mudam → re-render → componentDidUpdate executa — comparar estado anterior evita loops infinitos
  • Desmontagem (unmounting): componente é removido do DOM — componentWillUnmount executa — cancelar timers, remover listeners, limpar subscriptions
01

Um componente de chat inicia uma conexão WebSocket no componentDidMount. O que acontece se você não fechar essa conexão no componentWillUnmount? Quem paga a conta?

02

Por que o componentDidUpdate compara prevState.users !== this.state.users antes de executar? O que aconteceria sem essa comparação?

slide 05
conceito

componentDidMount — a fase de nascimento

  • Quando executa: uma única vez, imediatamente após o componente ser inserido no DOM
  • Para que serve: buscar dados de APIs, inicializar timers, configurar subscriptions, manipular o DOM diretamente
  • No UserTracker: carrega a lista inicial de usuários — simula a conexão com o servidor de monitoramento
componentDidMount — UserTracker
// Executa UMA VEZ após inserção no DOM
componentDidMount() {
  // Simula carregamento de dados do servidor
  this.setState({ users: ['Alice', 'Bob', 'Charlie'] });
}
01

Por que não buscar dados no constructor em vez do componentDidMount? Qual a diferença de timing — e por que isso importa para o React?

slide 06
conceito

# componentDidUpdate — reagindo a mudanças

  • Quando executa: após cada re-render causado por mudança em state ou props — recebe estado/props anteriores como parâmetros
  • Comparação obrigatória: sem if (prevState.x !== this.state.x), o método entra em loop infinito
  • No UserTracker: registra no console cada mudança na lista de usuários
componentDidUpdate — comparação de estado
componentDidUpdate(prevProps, prevState) {
  // SEM essa comparação → loop infinito garantido
  if (prevState.users !== this.state.users) {
    console.log('Usuários atualizados:', this.state.users);
  }
}
01

Remova o if do código e pense: componentDidUpdate chama setState que dispara um novo render que chama componentDidUpdate… Quando isso para? O que o navegador faria?

slide 07
conceito

componentWillUnmount — limpeza antes do fim

  • Quando executa: imediatamente antes do componente ser removido do DOM — última chance de executar código
  • O que limpar: timers (clearInterval, clearTimeout), event listeners, WebSockets, subscriptions de APIs
  • No UserTracker: simula desconexão de usuários ao sair do painel
  • Consequência de ignorar: memory leak — recursos continuam consumindo memória após o componente “morrer”
01

Um app de mapas usa GPS continuamente em um componente. O usuário navega para a tela de configurações. Sem componentWillUnmount, o GPS para de funcionar? O que acontece com a bateria?

02

No useEffect moderno, o cleanup é o return da função. Por que React escolheu esse design — cleanup dentro do mesmo bloco que o setup? Qual o benefício?

slide 08
caderno

Glossário — Ciclo de Vida no React

  • Ciclo de vida fases de existência de um componente: montagem, atualização, desmontagem
  • componentDidMount executa uma vez após inserção no DOM — buscar dados, inicializar
  • componentDidUpdate executa após re-render — comparar prevState/prevProps evita loop infinito
  • componentWillUnmount executa antes da remoção — cancelar timers, limpar subscriptions
  • useEffect(fn, []) equivalente ao componentDidMount em componentes funcionais
  • useEffect(fn, [dep]) equivalente ao componentDidUpdate — executa quando dep muda
  • cleanup (return) função retornada pelo useEffect — equivalente ao componentWillUnmount
  • memory leak recurso consumindo memória após não ser mais necessário — causado por falta de cleanup
? escreva no caderno antes de avançar
  • Em qual método você escreveria o código para buscar dados de uma API? Por quê não no constructor?
  • Qual é o maior risco de um componentWillUnmount incompleto? Dê um exemplo real de consequência visível ao usuário.
slide 09
pause_e_responda · 1 de 3

? Pause e Responda — Questão 1

O que é o “hook useState” utilizado no React?
  • A Um hook que dispara efeitos colaterais quando um componente é renderizado.
  • B Um hook que permite gerenciar o estado de um componente funcional.
  • C Um hook que permite monitorar o ciclo de vida de um componente.
  • D Um hook que é usado apenas para manipulação de eventos.

// escreva sua resposta no caderno · depois registre no AVA

slide 10
gabarito · questão 1

Gabarito — Questão 1

O que é o “hook useState” utilizado no React?
  • A Um hook que dispara efeitos colaterais quando um componente é renderizado. → isso descreve o useEffect, não useState
  • B Um hook que permite gerenciar o estado de um componente funcional.
  • C Um hook que permite monitorar o ciclo de vida de um componente. → ciclo de vida é responsabilidade do useEffect (com dependências)
  • D Um hook que é usado apenas para manipulação de eventos. → eventos são tratados via handlers (onClick, onChange), não hooks

✓ useState gerencia estado local em componentes funcionais — retorna [valorAtual, setter]. Toda chamada ao setter dispara re-render com o novo valor.

slide 11
pause_e_responda · 2 de 3

? Pause e Responda — Questão 2

Qual é a função principal do “hook useEffect” em um componente React?
  • A Gerenciar estados complexos dentro de um componente.
  • B Manipular diretamente o DOM de um componente.
  • C Executar efeitos colaterais, como chamadas de API, após a renderização de um componente.
  • D Monitorar o ciclo de vida de componentes de classe.

// escreva sua resposta no caderno · depois registre no AVA

slide 12
gabarito · questão 2

Gabarito — Questão 2

Qual é a função principal do “hook useEffect” em um componente React?
  • A Gerenciar estados complexos dentro de um componente. → estado complexo é responsabilidade do useReducer
  • B Manipular diretamente o DOM de um componente. → manipulação direta do DOM usa useRef
  • C Executar efeitos colaterais, como chamadas de API, após a renderização de um componente.
  • D Monitorar o ciclo de vida de componentes de classe. → componentes de classe usam métodos próprios (componentDidMount etc.)

✓ useEffect executa efeitos colaterais após a renderização — buscar dados, subscriptions, timers. A lista de dependências controla quando o efeito é reexecutado.

slide 13
pause_e_responda · 3 de 3

? Pause e Responda — Questão 3

O que acontece quando você omite a lista de dependências no “useEffect”?
  • A O “useEffect” não é executado.
  • B O “useEffect” será executado apenas quando o componente for desmontado.
  • C O “useEffect” será executado apenas uma vez após a montagem inicial do componente.
  • D O “useEffect” será executado após cada renderização do componente.

// tempo total do quiz: 3 minutos · registre no AVA após responder no caderno

slide 14
gabarito · questão 3

Gabarito — Questão 3

O que acontece quando você omite a lista de dependências no “useEffect”?
  • A O “useEffect” não é executado. → sem deps, o efeito ainda executa — na verdade, executa demais
  • B O “useEffect” será executado apenas quando o componente for desmontado. → isso acontece com o return de cleanup, não com a omissão de deps
  • C O “useEffect” será executado apenas uma vez após a montagem inicial. → isso acontece com useEffect(() => {}, []) — array VAZIO, não omitido
  • D O “useEffect” será executado após cada renderização do componente.

✓ Sem lista de dependências, useEffect executa após cada render — incluindo re-renders causados pelo próprio efeito. Se o efeito altera state, isso cria um loop infinito. Sempre declare as dependências explicitamente.

slide 15
contexto_atividade · aula prática

{ } UserTracker — ciclo de vida em produção

  • Cenário: desenvolver um painel de controle que monitora usuários online em tempo real, com controle preciso do ciclo de vida
  • Objetivo: implementar os três métodos de ciclo de vida — carregar lista ao montar, registrar atualizações, limpar ao desmontar
  • Formato: dupla · 40 minutos · roteiro impresso ou digital
  • Ferramenta: npx create-react-app user-tracker ou StackBlitz (sem instalação)
01

Antes de codificar: em qual ordem os três métodos serão chamados quando você abre e depois fecha o painel UserTracker? Escreva a sequência esperada.

02

Se você adicionar um setInterval no componentDidMount para atualizar a lista a cada segundo, o que PRECISA estar no componentWillUnmount? O que acontece sem isso?

slide 16
planejamento

Planejamento — estrutura antes do código

ARQUIVORESPONSABILIDADEMÉTODO-CHAVEFASE DO CICLO
UserList.jsComponente principal do painelcomponentDidMountMontagem — carregar lista
UserList.jsMonitorar mudançascomponentDidUpdateAtualização — log de mudanças
UserList.jsLimpeza antes de saircomponentWillUnmountDesmontagem — cleanup
App.jsComponente raizimport UserListOrquestra a renderização
? antes de codificar — responda no caderno O componente usa this.state = { users: [] }. Por que inicializar com array vazio em vez de null? O que aconteceria no render se users fosse null e tentássemos usar .map()?
slide 17
algoritmo

>_ Fluxo lógico — 4 passos do roteiro

  • Passo 1 — Setup: npx create-react-app user-trackercd user-trackercode .
  • Passo 2 — UserList.js: criar componente de classe com constructor, os 3 métodos de ciclo de vida e render
  • Passo 3 — App.js: substituir conteúdo padrão pelo import e uso de <UserList />
  • Passo 4 — Executar: npm start → verificar lista, testar atualização, abrir/fechar para acionar unmount
fluxo crítico — os 3 métodos na sequência correta
// ORDEM garantida pelo React:
// 1. constructor → 2. render → 3. componentDidMount
// state muda → render → componentDidUpdate
// componente some → componentWillUnmount
slide 18
implementacao

Implementação — VSCode ou StackBlitz

  • Sem instalação: acesse stackblitz.com → New Project → React — sem Node.js necessário no laboratório
  • Com instalação: npx create-react-app user-tracker → crie src/UserList.js → substitua App.js
  • Verificar: abra o DevTools (F12) → Console — observe os logs de cada fase do ciclo de vida
  • Teste de unmount: adicione um botão em App.js que alterna a exibição de <UserList /> — ao ocultar, componentWillUnmount deve aparecer no console
01

Abra o DevTools no console. Ao carregar a página, qual log aparece primeiro: o do componentDidMount ou o do componentDidUpdate? Por que essa ordem?

slide 19
testes

! Testes — 3 cenários de verificação

montagem

Lista vazia → componentDidMount → lista com Alice, Bob, Charlie

→ console: “Usuários atualizados: [‘Alice’, ‘Bob’, ‘Charlie’]”

atualização

Alterar o array users no setState → componentDidUpdate detecta mudança

→ console: log com novo estado registrado

desmontagem

Ocultar UserList com condicional no App.js → componentWillUnmount

→ console: “Desmontando componente, limpando dados…”

? análise final da dupla O que aconteceria se você removesse o if (prevState.users !== this.state.users) do componentDidUpdate? Teste e observe o console. Quantas vezes o log aparece? Por quê?
slide 20
entrega_ava

Entrega — O que enviar no AVA

o que enviar
  • Código completo do UserList.js com os 3 métodos
  • Código do App.js atualizado
  • Print do console mostrando logs das 3 fases
  • Resposta escrita: o que cada método faz e por que é necessário
critérios de avaliação
  • Implementação correta dos 3 métodos de ciclo de vida
  • Comparação prevState no componentDidUpdate presente
  • Logs aparecendo no console para cada fase
  • Justificativa técnica escrita para cada método
⌨ entrega · UserList.js + App.js + print do console + análise escrita · AVA · dupla · prazo: conforme calendário
slide 21
síntese

Então ficamos assim…

componentDidMount

Utilizar para executar código logo após o componente ser montado na tela — busca de dados, timers, subscriptions iniciais.

#componentDidUpdate

Monitorar e responder às mudanças no estado ou nas props — sempre comparar com prevState/prevProps para evitar loops.

componentWillUnmount

Limpar recursos — timers, assinaturas, listeners — quando o componente é removido da árvore. Previne memory leaks.

← aula anterior

Introdução ao React (8.1) — componentes, props, state e JSX como fundamentos de toda interface moderna.

→ próxima aula

Semana 9: Estilização e layout — CSS-in-JS, styled-components e organização visual de componentes React em escala.