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

203
Vistas
Al actualizar className css transición "un paso atrás"

Tengo un formulario que "desliza" los diferentes pasos como tarjetas, por ejemplo, al pasar del paso 1 al paso 2, la tarjeta aparece desde la derecha, y al retroceder, por ejemplo, del paso 3 al paso 2, la tarjeta se desliza desde la izquierda.

Mi problema es que la dirección está "un paso atrás", se necesitan dos clics en una dirección para que la transición se recupere.

Cuando se hace clic en los botones anterior/siguiente, se llama a handleActive() :

 const handleActive = (num, text) => { setDirection(text) setActive(num) }

Un ejemplo de una tarjeta div

 <div className={active === 2 ? 'card-active' : 'card-' + direction}> <h4>Step {active}</h4> <input className='input' type="text" name="name" id="name" placeholder='Name' /> <input className='input' type="text" name="address" id="address" placeholder='Address' /> <input className='input' type="text" name="phone" id="phone" placeholder='Phone' /> <button className='btn' type="button" onClick={() => handleActive(-1, 'from-left')}>PREV</button> <button className='btn' type="button" onClick={() => handleActive(1, 'from-right')}>NEXT</button> </div>

CSS:

 .card-from-right { ... left: 35%; transition: left 800ms 0ms ease-out, height 0ms 800ms, opacity 400ms 0ms ease-in; } .card-from-left { ... left: 25%; transition: left 800ms 0ms ease-out, height 0ms 800ms, opacity 400ms 0ms ease-in; } .card-active { ... left: 30%; }

Probé async/await en la función handleActive() y useEffect , pero lo único que funciona es setTimeout (pero eso es demasiado complicado)

 const handleActive = async (num, text) => { await setDirection(text) await setActive(num) }
 const handleActive = async (num, text) => { await setDirection(text) setTimeout(() => { setActive(num) }, 600); }

¿Cómo podría pausar (y modificar el DOM?) para actualizar los nombres de clase antes de ejecutar setActive() ? Console.log y el código fuente muestran los classNames correctos, pero de alguna manera no a tiempo antes de setActive() ...

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

0

Esta es una idea aproximada de usar useEffect. También puede usar num como una dependencia si lo necesita. O podrías usar funciones. Mi punto principal sería poner la mayor parte, si no toda, la lógica condicional dentro de useEffect. (o al menos abstraerse de useEffect)

 useEffect(() => { if (direction === "to-left") { setActive(-1) } else { setActive(1) } }, [direction]);
about 4 years ago · Juan Pablo Isaza Denunciar

0

Pude resolver el problema con una "variable de marcador de posición": activeSetter (el problema con la solución useEffect anterior era que no se activaba si la dirección no cambiaba). Ahora todo sucede en el orden correcto:

  • el nombre de clase correcto se establece en tarjetas no activas
  • el activeSetter tiene el número de la próxima tarjeta activa
  • y los cambios en activeSetter desencadenan useEffect que establece la nueva tarjeta activa
 const [activeSetter, setActiveSetter] = useState(1) useEffect(() => { setActive(activeSetter) }, [setActive, activeSetter]) const handleActive = (num, text) => { setDirection(text) setActiveSetter(num) }
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