Questão nº 61
Questão de Tecnologia da Informação · FGV TRF1 2024 (nº 61)
Considere o seguinte código de uma aplicação React:
import React, {useState, useEffect} from 'react';
const CVinteUm = () => {
const [estado, setEstado] = useState(0);
let variável = true;
useEffect(() => {
new Promise(r=>{r()})
.then(()=>setEstado(e=>e+'10'))
return () => { variável = false; };
}, []);
return <div>{"${estado} ${variável}"}</div>
}
export function App(props) {
return (<CVinteUm />);
}
Ao ser executado em um browser web, após completadas as renderizações, o componente App exibe:
- Anada;
- Bo texto "0 false";
- Co texto "010 true"; (alternativa correta)
- Do texto "010 false";
- Euma mensagem de erro.
Resposta comentada
Gabarito Alternativa C
Quando um componente React é renderizado, todas as variáveis declaradas diretamente em seu corpo são inicializadas a cada nova renderização. O hook useEffect executa sua função após a renderização inicial e sua função de limpeza (retornada pelo useEffect) só é executada quando o componente é desmontado ou antes de uma nova execução do próprio useEffect (se as dependências mudarem).
- (A) Incorreta: O componente sempre renderiza algo, não fica vazio.
- (B) Incorreta: O estado
estadoé modificado assincronamente e a variávelvariávelé re-inicializada em cada renderização. - (C) Correta: Na primeira renderização,
estadoé0evariávelétrue. OuseEffecté disparado, e a Promise resolve imediatamente, chamandosetEstado(e=>e+'10'). Isso atualizaestadopara"010"(concatenação de string) e dispara uma nova renderização. Na segunda renderização,estadoé"010". A variávelvariávelé re-declarada e re-inicializada comotruepara esta nova renderização. A função de limpeza douseEffect(que mudariavariávelparafalse) não é executada porque o componente não foi desmontado e ouseEffectnão está sendo re-executado (devido ao array de dependências vazio[]). Assim, o resultado final é"010 true". - (D) Incorreta: Esta é a pegadinha. A variável
variávelé uma variável local do componente e é re-inicializada paratrueem cada renderização. A função de limpeza douseEffectsó seria executada quando o componente fosse desmontado (ou se ouseEffectfosse re-executado com dependências diferentes), e mesmo que fosse, ela modificaria avariávelda renderização anterior, não avariávelda renderização atual que está sendo exibida. - (E) Incorreta: O código é sintaticamente correto e não há erros de execução.
Fonte: FGV TRF1 2024 Técnico Judiciário - Desenvolvimento de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.