1
resposta

Erro no código do exerc´cio "Modificando estados"

No código dado de exemplo:

const [brownies, setBrownies] = useState([])

const aoMudarInput = event => {
    const novaLista = brownies  // criando cópia do estado para poder modificar o valor
    novaLista.push(event.target.value)
    setBrownies(novaLista)
}

return (
….

…. )

Há essa linha, com esse comentário: const novaLista = brownies // criando cópia do estado para poder modificar o valor
Porém isso não cira uma nova lista para que seja possível alterar o valor, isso apenas crias duas variáveis apontando pro mesmo endereço de memória.
O correto seria usar o spread oprator: const novaLista = [...brownies]

1 resposta

Olá, Ygor. Como vai?

Você está coberto de razão! Excelente percepção e sensibilidade técnica. Esse é um erro clássico que costuma passar despercebido por muitas pessoas, mas que quebra um dos princípios mais fundamentais do React: a imutabilidade dos estados.

Como você muito bem pontuou, a linha const novaLista = brownies não cria um novo array na memória. Ela apenas copia a referência (o endereço de memória) do array original. No JavaScript, objetos e arrays são passados por referência.

O que acontece de errado nessa abordagem?

  1. Mutação Direta: Ao fazer novaLista.push(...), o código altera diretamente o conteúdo do array que está dentro do estado brownies.
  2. Falha na Renderização: O React é baseado em comparações rasas (shallow comparison) para saber se um estado mudou e se ele precisa atualizar a tela. Quando você chama setBrownies(novaLista), o React compara o "novo" endereço com o "velho" endereço. Como ambos apontam exatamente para o mesmo lugar na memória, o React acha que nada mudou e não renderiza novamente a tela.

A Solução Correta (Como você propôs)

Sua solução utilizando o Spread Operator (...) está impecável. Ela cria um array totalmente novo na memória, descarrega os itens antigos lá dentro e permite que a atualização funcione perfeitamente:

const aoMudarInput = event => {
    const novaLista = [...brownies] // Agora sim, uma cópia real com um novo endereço de memória
    novaLista.push(event.target.value)
    setBrownies(novaLista)
}

Dica de Ouro: Versão ainda mais enxuta

No ecossistema React, é ainda mais comum e elegante realizar essa operação em uma única linha, passando o novo array diretamente para a função de atualização:

const aoMudarInput = event => {
    setBrownies([...brownies, event.target.value])
}

Parabéns pelo olhar clínico de depuração e pelo domínio sobre como o JavaScript gerencia referências na memória. Reportar isso no fórum ajuda imensamente outros estudantes que possam estar enfrentando bugs de interface travada por conta desse trecho!

Espero que possa ter lhe ajudado!