Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

530
Visualizações
TypeError: no se pueden leer las propiedades de null (leyendo 'classList') Reaccionar

Tengo este encabezado que, al desplazarse, quiero cambiar el fondo a un color diferente. La variable de la navbar de navegación devuelve nulo siempre. ¿Por que es esto entonces? ¿Cómo puedo hacer eso? El transform:translateY es solo para una pequeña animación en el desplazamiento.

 import React from 'react' import { Navbar, Container, Nav } from 'react-bootstrap' import { LinkContainer } from 'react-router-bootstrap' const Header = () => { const navbar = document.getElementById("navbar"); let scrolled = false; window.onscroll = function () { if (document.body.scrollTop >= 200 || document.documentElement.scrollTop >= 200) { navbar.classList.add('color-nav'); if (!scrolled) { navbar.style.transform = 'translateY(-70px)' } setTimeout(function () { navbar.style.transform = 'translateY(0px)' scrolled = true }, 200) } else { navbar.classList.remove('color-nav'); scrolled = false } }; return ( <div id='navbar' > <Navbar fixed="top" className='navbar' collapseOnSelect expand="lg" > <Container> <LinkContainer to='/'> <Navbar.Brand className='logo' >Logo</Navbar.Brand> </LinkContainer> <Navbar.Toggle aria-controls="responsive-navbar-nav" /> <Navbar.Collapse id="responsive-navbar-nav"> <Nav className="me-auto"> <LinkContainer to='/services'> <Nav.Link className='links'>Services</Nav.Link> </LinkContainer> </Nav> <Nav> <LinkContainer to='/login'> <Nav.Link className='links'>Login</Nav.Link> </LinkContainer> <LinkContainer to='/signup'> <Nav.Link className='links'> Sign Up </Nav.Link> </LinkContainer> </Nav> </Navbar.Collapse> </Container> </Navbar> </div > ) } export default Header

ingrese la descripción de la imagen aquí

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Estás haciendo las cosas en lo que me gustaría llamar, "en contra de la forma React". Para acceder al elemento de la barra de navegación, debe utilizar el useRef . Esto le dará una referencia fácil a ese elemento a través del ciclo de vida de los componentes.

Además de eso, hay algunos otros problemas que deben ser atendidos:

  • La variable scrolled no se usa con useState
  • Su oyente de desplazamiento no está configurado en un useEffect . En este momento, su código establecería un nuevo oyente en cada nueva representación de su componente. Solo desea configurarlo una vez.
  • Su oyente de desplazamiento no se limpia.

He realizado algunos cambios en el código que espero solucionen este problema.

 import React, { useState, useRef, useEffect } from "react"; import { Navbar, Container, Nav } from "react-bootstrap"; import { LinkContainer } from "react-router-bootstrap"; const Header = () => { const [scrolled, setScrolled] = useState(false); const navRef = useRef(); useEffect(() => { const handleScroll = () => { if ( document.body.scrollTop >= 200 || document.documentElement.scrollTop >= 200 ) { navRef.current.classList.add("color-nav"); if (!scrolled) { navRef.current.style.transform = "translateY(-70px)"; } setTimeout(function () { navRef.current.style.transform = "translateY(0px)"; setScrolled(true); }, 200); } else { navRef.current.classList.remove("color-nav"); setScrolled(false); } }; window.addEventListener("scroll", handleScroll); return () => { window.removeEventListener("scroll", handleScroll); }; }, []); return ( <div id="navbar" ref={navRef}> <Navbar fixed="top" className="navbar" collapseOnSelect expand="lg"> <Container> <LinkContainer to="/"> <Navbar.Brand className="logo">Logo</Navbar.Brand> </LinkContainer> <Navbar.Toggle aria-controls="responsive-navbar-nav" /> <Navbar.Collapse id="responsive-navbar-nav"> <Nav className="me-auto"> <LinkContainer to="/services"> <Nav.Link className="links">Services</Nav.Link> </LinkContainer> </Nav> <Nav> <LinkContainer to="/login"> <Nav.Link className="links">Login</Nav.Link> </LinkContainer> <LinkContainer to="/signup"> <Nav.Link className="links">Sign Up</Nav.Link> </LinkContainer> </Nav> </Navbar.Collapse> </Container> </Navbar> </div> ); }; export default Header;
about 4 years ago · Juan Pablo Isaza Relatório

0

No lo estás haciendo de manera reactiva. hay muchas maneras en las que podría hacer esto, uno de ellos es que puede usar el gancho useState para mantener el seguimiento del desplazamiento y actualizarlo en el cambio de altura de esta manera en jsx, puede usar el operador ternario para cambiar el nombre de clase como

 <div className = {scrolled ? "color-nav" : "something" }
about 4 years ago · Juan Pablo Isaza Relatório

0

Está intentando obtener la barra de navegación antes de que se represente. Es por eso que su variable es nula. Intente usar Ref para acceder a un elemento de nodo en React. Las respuestas aquí pueden ser útiles para usted.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda