Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

204
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!