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

168
Vistas
¿Qué tan horrible es renderizar un componente en 3 fases diferentes?

Que horrible es eso:

 useLayoutEffect(() => {
 setWidth(ganttContainerRef.current.offsetWidth);
 setHeight(ganttContainerRef.current.offsetHeight);
 }, [])

 useLayoutEffect(() => {
 if (width > 0) {
 setGanttReady(true);
 }
 }, [width])

 useLayoutEffect(() => {
 if (ganttReady) {
 ganttRef.current.scrollTo({ left: 80 * 80 / 7 + 40 });
 }
 }, [ganttReady]);

es decir, renderizar un componente en 3 pasos separados...

  1. Uno para renderizar el contenedor (este contenedor está construido con %age, y necesito el ancho real para los pasos 2 y 3)
  2. Uno para representar el texto que se muestra en este contenedor (necesita la altura del texto para el paso 3)
  3. Uno para representar mi gantt (todo con muchas posiciones absolutas)

Si renderizo 1 y 2 al mismo tiempo, el ancho del contenedor será 0 (primer renderizado) porque 2 aún no se muestra. No importa lo que haga, si hago const top = refs.current[initiative.id].offsetTop; , offsetTop tendrá un valor como si el ancho aún fuera 0. offsetTop no se actualiza con una nueva representación.

Con el código publicado arriba, funciona bien, pero ¿qué tan malo es? ¿Es factible renderizar un componente en varias fases o realmente estoy pirateando el comportamiento normal de React?

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

0

Con el código publicado arriba, funciona bien, pero ¿qué tan horrible es? ¿Es factible representar un componente en varias fases o realmente estoy pirateando el comportamiento normal de React?

No diría que es horrible, se podría decir que no es muy eficiente, pero no me preocuparía si no se nota.

Puedes refactorizarlo a algo como esto:

 useLayoutEffect(() => {
 let offsetWidth = ganttContainerRef.current.offsetWidth;
 setWidth(offsetWidth);
 setHeight(ganttContainerRef.current.offsetHeight);

 if (offsetWidth > 0) {
 setGanttReady(true);
 ganttRef.current.scrollTo({ left: (80 * 80) / 7 + 40 });
 }
 }, []);

Pero el problema con este enfoque es que, como puede ver, solo se ejecuta en el montaje; que está bien si eso es lo que quieres. Entonces, con su enfoque anterior aquí:

 useLayoutEffect(() => {
 if (width > 0) {
 setGanttReady(true);
 }
 }, [width])

tenías la ventaja de que si el width cambiaba, entonces podías actuar en consecuencia, no lo obtienes con mi versión. Así que depende.

almost 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