Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

195
Visualizações
no se puede obtener el valor de estado actualizado dentro del método

Quiero detener el bucle cuando stopState sea verdadero.

El estado de parada se actualiza cuando hago clic en el botón de parada. pero dentro del método startIncrement, stopState siempre es falso.

Este es mi código:

 function App() { const [num, setNum] = useState(0) const [stop, setStop] = useState(false) function Delay(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); } async function startIncrement(){ for(let i=0; i<100; i++){ console.log(stop) // always false even when i click the stop button if(stop) i = 2000; setNum(i) await Delay(1000) } } return ( <main> <p>stop: {stop ? "true" : "false"}</p> <p onClick={startIncrement}>{num}</p> <button onClick={() => setStop(true)}>stop</button> </main> ); }
about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Respuesta corta:

Para detener la función ejecutada anteriormente, deberá invocar una función de "limpieza".

Detalle de cómo funciona:

En reaccionar, cada representación tiene sus propios accesorios y estado, y podemos explicar esto en acción:
  1. Primero, ejecutó la función startIncrement() , en el momento de la ejecución, y en esa fase particular de renderizado, el valor de stop es falso;
  2. Cada vez que cambia el valor num , la página se procesa y continúa... (ejecuta el código debajo, puedes ver las impresiones de la consola "¡se procesa!")
  3. Luego hace clic en el botón setStop(true) , y en este render particular, stop === true.

Sin embargo, estos dos pasos involucran dos renderizados diferentes, y el estado de cada renderizado y todo lo demás (accesorios, efectos...), no se afectan entre sí, por lo tanto, su valor de stop en la función nunca cambia.

Aquí hay una alternativa para lograr lo mismo:

 export default function App() { const [num, setNum] = useState(0) const [stop, setStop] = useState(null) console.log("renders!") useEffect(() => { const run = setInterval(() => { if(stop === false && num < 100) setNum(num + 1); }, 1000); return () => clearInterval(run) // clean up function }, [num, stop]); return ( <main> <p>stop: {stop ? "true" : "false"}</p> <p>{num}</p> <button onClick={() => setStop(false)}>start</button> <button onClick={() => setStop(true)}>stop</button> </main> ); }

La función de limpieza en useEffect puede verse como una función de "deshacer".

Sandbox aquí , puede leer más sobre los efectos secundarios de esta publicación en el blog de Dan Abramov

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda