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

232
Vistas
Reaccionar: ¿Cómo evito el uso de useRef y useState para realizar un seguimiento de un mismo valor para evitar que useEffect se active?

actualmente estoy creando una barra de navegación que solo se muestra cuando se desplaza hacia arriba, para evitar que useEffect se ejecute cada vez que cambia el estado visible, tuve que usar tanto una referencia como un estado sincronizado para hacer una comparación en useEffect, usando ref y un estado para realizar un seguimiento de un mismo valor parece extremadamente sospechoso, ¿hay otra forma de hacerlo? ¿uno que no implique activar useEffect para que no cree los controladores de eventos cada vez que cambia el estado?

 import React, { useState, useRef, useEffect } from 'react'; import Link from 'next/link'; const NavbarLink = ({ name, href }: { name: string, href: string }) => { return ( <Link href={href}> <a>{ name }</a> </Link> ); } const Navbar = () => { const scrollYRef = useRef(0); const visibleRef = useRef(true); const [visible, setVisible] = useState(true); useEffect(() => { const onScroll = (event: Event) => { event.preventDefault(); if ((window.scrollY < scrollYRef.current) != visibleRef.current) { visibleRef.current = !visibleRef.current; setVisible(x => !x); } scrollYRef.current = window.scrollY; } window.addEventListener('scroll', onScroll); return () => { window.removeEventListener('scroll', onScroll); } }, []); return ( <div className={`${!visible && '-translate-y-full'} fixed flex w-full h-32 font-bold text-white transition-all`}> <NavbarLink name="home" href='/'/> </div> ); }
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Puede usar el patrón "última referencia" (aquí a través del gancho useLatest react-use ), que encuadra el valor más reciente de un átomo de estado en cada momento de actualización del componente, por lo que no necesita administrarlo manualmente, y no No lo necesito como una dependencia para el gancho. (También tomaría useEvent de react-use si terminas usándolo).

 import React, { useState, useRef, useEffect } from "react"; import Link from "next/link"; // via https://github.com/streamich/react-use/blob/master/src/useLatest.ts const useLatest = (value) => { const ref = useRef(value); ref.current = value; return ref; }; const NavbarLink = ({ name, href }: { name: string; href: string }) => { return ( <Link href={href}> <a>{name}</a> </Link> ); }; function useVisibleOnScrollUp(initial = true) { const scrollYRef = useRef(window.scrollY); const [visible, setVisible] = useState(initial); const latestVisibleRef = useLatest(visible); useEffect(() => { const onScroll = (event: Event) => { event.preventDefault(); const currentVisible = latestVisibleRef.current; if (window.scrollY < scrollYRef.current != currentVisible) { setVisible((x) => !x); } scrollYRef.current = window.scrollY; }; window.addEventListener("scroll", onScroll); return () => { window.removeEventListener("scroll", onScroll); }; }, []); return visible; } const Navbar = () => { const visible = useVisibleOnScrollUp(true); return ( <div className={`${ !visible && "-translate-y-full" } fixed flex w-full h-32 font-bold text-white transition-all`} > <NavbarLink name="home" href="/" /> </div> ); };
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