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

103
Vistas
¿Qué hace que mi mouseover y reaccionar setState sean lentos?

Se siente como cualquier tipo de acción de "hacer clic y arrastrar" que creo se siente un poco ... bueno, entrecortado. Como si estuviera tartamudeando. Sé que cuando registro en la consola, los datos son instantáneos desde el evento, pero los retrasos en la actualización del estado son los que hacen que parezca más lento.

Aquí hay un ejemplo muy simple:

 const TestMouseOver = () => { const [pos, setPos] = useState(); const onMouseDown = (e) => { setPos({ x: e.clientX + document.body.scrollLeft, y: e.clientY + document.body.scrollTop, }) } const onMouseMove = (e) => { setPos({ x: e.clientX + document.body.scrollLeft, y: e.clientY + document.body.scrollTop, }) } return ( <div onMouseDown={(event) => onMouseDown(event)} onMouseMove={(event) => onMouseMove(event)} onMouseUp={() => setPos(null)} > {pos && <MoveBox position={pos} />} </div> ); };

dentro de MoveBox , tomo la pos y simplemente configuro el css absoluto del div como la posición (componentes con estilo). Nada de lujos allí. Funciona pero es lento y lento.

¿Debería intentar crear algún tipo de lerp o animación para ir al último cable conocido para suavizar la actualización de posición?

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

MouseEvents no están limitados: cada vez que se mueva el mouse, llamará a sus funciones setState . Eso puede suceder cientos de veces por segundo, lo que hace que React se vuelva a renderizar con tanta frecuencia, lo que es mucho menos óptimo.

Con el tempo máximo, React no debería renderizar más de cada fotograma de 16 ms para garantizar animaciones fluidas de 60 FPS en su sitio web.

Debe acelerar estos eventos usando lodash.throttle por ejemplo y registrar una devolución de llamada usando useCallback .

Código de muestra :

 const handleMouseMove = useCallback(lodash.throttle((e) => { setPos({ x: e.clientX + document.body.scrollLeft, y: e.clientY + document.body.scrollTop, }); }, 16), []); return ( <div onMouseMove={handleMouseMove}>{...}</div> )

Observe el 16 como el segundo argumento de lodash.throttle : garantiza que la función no se llame con más frecuencia que cada 16 ms.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Otro posible enfoque que debe considerar sería usar una solicitud de api nativa del navegadorAnimationFrame

https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame

Así se implementaría para tu caso específico

 const TestMouseOver = () => { const [pos, setPos] = useState(); let ticking = false; function onMouseMove(event) { requestTick(event); } function onMouseDown(event) { requestTick(event); } function requestTick(event) { if (!ticking) { requestAnimationFrame(update(event)); } ticking = true; } function update(e) { // reset the tick so we can capture next mouseevent ticking = false; setPos((prevState) => ({ x: e.clientX + document.body.scrollLeft, y: e.clientY + document.body.scrollTop, })) } return ( <div onMouseDown={(event) => onMouseDown(event)} onMouseMove={(event) => onMouseMove(event)} onMouseUp={() => setPos(null)} > {pos && <MoveBox position={pos} />} </div> ); };

PROS:

  • Sin necesidad de bibliotecas externas
  • Se ejecuta sobre la base de un cuadro. Por lo tanto, el comportamiento de la interfaz de usuario es fluido.

CONTRAS:

  • No tiene soporte para IE9
  • No se puede definir la duración del acelerador porque está acoplado a la velocidad de fotogramas

Cómo funciona: básicamente, usando una variable y el método requestAnimationFrame, nos aseguramos de que el estado se actualice a la velocidad de actualización del cuadro.

about 4 years ago · Juan Pablo Isaza 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