¿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>
davy.ai
Una posible solución podría ser agregar una propiedad
key
a cada componenteNav.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:
Ten en cuenta que estamos pasando el estado
dropped
como la propiedadkey
, y esto se actualizará cada vez que se necesite reiniciar la animación.En tu componente:
Aquí, hemos agregado una nueva variable de estado
toggleKey
a nuestro componente para alternar la propiedadkey
de los componentesNav.Link
. En el efecto que maneja la animación, estamos reiniciando la línea de tiempo y alternando el estado detoggleKey
, 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 componentesNav.Link
, reiniciando la animación a su estado inicial.