Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

124
Vistas
¿Por qué React useState hook desencadena una nueva representación antes de que se ejecute el código restante?

Estoy tratando de averiguar cuándo se produce la nueva representación al actualizar el estado en React con useState hook. En el siguiente código, al hacer clic en el botón se activa la función handleClick que contiene un setTimeout. La devolución de llamada dentro de setTimeout se ejecuta después de 1 segundo, lo que actualiza el conteo de la variable de estado llamando a setCount. Luego, un registro de la consola imprime un mensaje.

El orden en el que espero que aparezcan los registros de la consola una vez que se hace clic en el botón es:

  1. 'Contar antes de actualizar', 0
  2. 'Contar actualización de publicación en setTimeout', 0
  3. 'Contar en render', 1

Sin embargo, el orden que veo después de ejecutar este código es:

  1. 'Contar antes de actualizar', 0
  2. 'Contar en render', 1
  3. 'Contar actualización de publicación en setTimeout', 0

¿Cómo es que aparece "'Count in render', 1" antes de "'Count post update in setTimeout', 0"? ¿SetCount no da como resultado la programación de una nueva representación que no es inmediata? ¿No debería la consola iniciar sesión inmediatamente después de que la llamada a la función setCount siempre se ejecute antes de que se active la nueva representación?

 function AppFunctional() { const [count, setCount] = React.useState(0); const handleClick = () => { console.log('Count before update', count); setTimeout(() => { setCount(count + 1); console.log('Count post update in setTimeout', count); }, 1000); }; console.log('Count in render', count); return ( <div className="container"> <h1>Hello Functional Component!</h1> <p>Press button to see the magic :)</p> <button onClick={handleClick}>Increment</button> {!!count && ( <div className="message">You pressed button {count} times</div> )} </div> ); } ReactDOM.render(<AppFunctional />, document.querySelector('.react'));
 <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script> <div class='react'></div>

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

¿setCount no da como resultado la programación de una nueva representación que no es inmediata? ¿No debería la consola iniciar sesión inmediatamente después de que la llamada a la función setCount siempre se ejecute antes de que se active la nueva representación?

Bajo el capó, React optimiza las re-renderizaciones al ponerlas en cola y agruparlas en lotes cuando puede determinar que es seguro hacerlo . Cuando está en una función que React entiende (como un componente funcional o una devolución de llamada de gancho), si llama a un setter de estado en una de esas funciones, React sabrá que es seguro retrasar la actualización de estado hasta que finalice su procesamiento, por ejemplo , hasta que se hayan ejecutado todas las devoluciones de llamada de efectos/notas/etc., y hasta que todos los componentes del estado original se hayan pintado en la pantalla.

Pero cuando llama a una actualización de estado fuera de una función React incorporada, React no sabe lo suficiente sobre su comportamiento para saber cuándo podrá volver a renderizarse a continuación si retrasa la actualización de estado. La llamada setTimeout no se llama desde dentro del ciclo de vida de React, por lo que es mucho más difícil agrupar actualizaciones y optimizarlas, por lo que, en lugar de que React intente adivinar cómo podría hacerse de forma segura y asincrónica, se vuelve a procesar de inmediato.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda