es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe una forma de utilizar useLocation de React para reiniciar la línea de tiempo de la animación de Gsaps?

Tengo tres enlaces que actualmente estoy animando para que se deslicen hacia abajo cuando el usuario hace clic en el botón de menú desplegable. Funciona bien cuando el usuario hace clic en el botón de alternancia de nuevo.

El problema: cuando el usuario hace clic en una ruta y navega hacia otra, luego vuelve para seleccionar otra ruta, la animación no comienza de nuevo. La animación debería reiniciarse a la posición inicial, incluso si el usuario navega a otra ruta.

Esto es lo que tengo actualmente:

let linkOne = useRef(null);
let linkTwo = useRef(null);
let linkThree = useRef(null);

const [dropped, setDropped] = useState()

const tl = useRef()
useEffect(() => {
tl.current = new gsap.timeline()
.to([linkOne, linkTwo, linkThree], { y: 30, stagger: { amount: .3 } });
return tl.current.kill()
}, [])

useEffect(() => {
dropped ? tl.current.play() : tl.current.reverse();
}, [dropped])

HTML:

<navbar.toggle onclick=”{()” ==””> setDropped(!dropped)} aria-controls=”responsive-navbar-nav” />

<nav.link ref=”{el” ==””> linkOne = el} as={Link} to=”/About” href=”#About”>About</nav.link>
<nav.link ref=”{el” ==””> linkTwo = el} as={Link} to=”/TestPage” href=”#TestPage”>Test Page</nav.link>
<nav.link ref=”{el” ==””> linkThree = el} as={Link} to=”/GsapImageReveal” href=”#GsapImageReveal”>GsapImageReveal</nav.link>

He intentado usar useLocation:

let location = useLocation()
useEffect(() => {
dropped ? tl.current.play() : tl.current.reverse();
console.log(location)
}, [dropped, location])

Esto no funciona. Pero creo que useLocation está en el camino correcto porque me da un cambio de ruta.

¿Alguien puede sugerir una solución o una mejor manera de abordar esto?

Usando react-router v6.</navbar.toggle>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución podría ser agregar una propiedad key a cada componente Nav.Link e incrementarla cada vez que se necesite reiniciar la animación. Esto obligará a React a desmontar y volver a montar los componentes, reiniciando así la animación a su estado inicial.

    Así es como puedes implementarlo:

    En tu JSX:

    <nav.link key="{dropped}" ref="{el" ==""> linkOne = el} as={Link} to="/About" href="#About">About</nav.link>
    <nav.link key="{dropped}" ref="{el" ==""> linkTwo = el} as={Link} to="/TestPage" href="#TestPage">Test Page</nav.link>
    <nav.link key="{dropped}" ref="{el" ==""> linkThree = el} as={Link} to="/GsapImageReveal" href="#GsapImageReveal">GsapImageReveal</nav.link>
    

    Ten en cuenta que estamos pasando el estado dropped como la propiedad key, y esto se actualizará cada vez que se necesite reiniciar la animación.

    En tu componente:

    const [toggleKey, setToggleKey] = useState(true);
    
    useEffect(() => {
        // Crea la línea de tiempo y agrega la animación.
        tl.current = new gsap.timeline()
            .to([linkOne, linkTwo, linkThree], { y: 30, stagger: { amount: .3 } });
    
        // Limpia en el desmontaje.
        return () => {
            tl.current.kill();
        };
    }, [linkOne, linkTwo, linkThree]);
    
    useEffect(() => {
        // Reinicia la animación cada vez que se hace clic en el botón de alternancia.
        tl.current.restart();
    
        // Alterna la clave para forzar la remontaje de los componentes Nav.Links.
        setToggleKey(prevKey => !prevKey);
    }, [dropped]);
    

    Aquí, hemos agregado una nueva variable de estado toggleKey a nuestro componente para alternar la propiedad key de los componentes Nav.Link. En el efecto que maneja la animación, estamos reiniciando la línea de tiempo y alternando el estado de toggleKey, lo que provoca el remontaje del componente.

    Con esta implementación, cada vez que el usuario navega hacia adelante y vuelve, el estado dropped se actualizará, lo que provocará que se reinicie la animación y se remonte los componentes Nav.Link, reiniciando la animación a su estado inicial.

Comments are closed.