我尝试创建并使用动画汉堡包菜单图标,而不是为我的 Navbar 组件制作的图标
`const menu = document.querySelector('.menu_button');
const showMenu = document.querySelector('.mobile-nav');
let menuOpen = false;
console.log(menu);
menu.addEventListener('click', () => {
if(!menuOpen){
menu.classList.add('close');
showMenu.classList.add('open');
menuOpen= true;
} else {
menu.classList.remove('close');
showMenu.classList.remove('open');
menuOpen = false;
}
})
`
它一直给我一个错误信息,说不能读取 null 的属性
const menu = document.querySelector('.menu_button')
线。
Uncaught TypeError: Cannot read properties of null (reading 'addEventListener') 在 Navbar (Navbar.jsx:17:1) 在 renderWithHooks (react-dom.development.js:14985:1)
这是完整的组件。
`import Toggle from "../Toggle/Toggle";
import "./Navbar.css";
import {Link} from 'react-scroll'
const Navbar = () => {
const menu = document.querySelector('.menu_button');
const showMenu = document.querySelector('.mobile-nav');
let menuOpen = false;
console.log(menu);
menu.addEventListener('click', () => {
if(!menuOpen){
menu.classList.add('close');
showMenu.classList.add('open');
menuOpen= true;
} else {
menu.classList.remove('close');
showMenu.classList.remove('open');
menuOpen = false;
}
})
return (
<div className="n-wrapper" id="Navbar">
{/* left */}
<div className="n-left">
<div className="n-name">Barr Ify</div>
<Toggle />
</div>
{/* right */}
<div className="n-right">
<div className="n-list">
<ul >
<Link activeClass="active" to="Navbar" spy={true} smooth={true}>
<li>
Home
</li>
</Link>
<Link to="services" spy={true} smooth={true}>
<li>
Services
</li>
</Link>
<Link to="experience" spy={true} smooth={true}>
<li>
Experience
</li>
</Link>
<Link to="portfolio" spy={true} smooth={true}>
<li>
Portfolio
</li>
</Link>
<Link to="testimonial" spy={true} smooth={true}>
<li>
Testimonial
</li>
</Link>
<div className="menu-wrapper">
<div className="menu_button">
<div className="bars"></div>
</div>
</div>
</ul>
</div>
{/* Mobile Nav */}
<div className="mobile-nav">
<ul className="mobile-lists">
<Link activeClass="active" to="Navbar" spy={true} smooth={true}>
<li>
Home
</li>
</Link>
<Link to="services" spy={true} smooth={true}>
<li>
Services
</li>
</Link>
<Link to="experience" spy={true} smooth={true}>
<li>
Experience
</li>
</Link>
<Link to="portfolio" spy={true} smooth={true}>
<li>
Portfolio
</li>
</Link>
<Link to="testimonial" spy={true} smooth={true}>
<li>
Testimonial
</li>
</Link>
</ul>
<Link to="contact" spy={true} smooth={true}>
<button className="button mobile-nav-button">Contact</button>
</Link>
</div>
<Link to="contact" spy={true} smooth={true}>
<button className="button n-button">Contact</button>
</Link>
</div>
{/* Mobile Nav */}
</div>
);
};
export default Navbar;
`
你正试图在 React 组件中使用 vanilla JS DOM 操作,这可能会导致问题,因为 React 会为你管理 DOM。当你使用 React 时,最好使用内置的特性和钩子来操作 DOM,而不是直接查询和修改元素。
您应该了解并使用来自 React 的 useRef 和 useState 钩子。
使用这些钩子,您可以创建对 DOM 元素的引用,并管理组件的状态。然后,您可以创建一个函数来处理点击事件并相应地更新状态,最后使用 ref 属性将您的引用链接到适当的元素,并使用 onClick 属性添加点击事件处理程序。 我希望你能在没有社区支持的情况下自己处理代码中的更改——因为你需要它,首先阅读、尝试,如果没有帮助——回来 =) 但我相信你会处理它! 祝你好运!
@Sergey Karlinsky 我认为 useState 可以处理它。谢谢,你回答的前四行告诉了我我需要听到的一切。这是我的处理方式,如果有更清洁的方法请告诉我。
const Navbar = () => {
const [closeBar, setcloseBar] = useState (false)
const [showMenu, setshowMenu] = useState(false)
return (
<div className="n-wrapper" id="Navbar">
{/* left */}
<div className="n-left">
<div className="n-name">Barr Ify</div>
<Toggle />
</div>
{/* right */}
<div className="n-right">
<div className="n-list">
<ul >
<Link activeClass="active" to="Navbar" spy={true} smooth={true}>
<li>
Home
</li>
</Link>
<Link to="services" spy={true} smooth={true}>
<li>
Services
</li>
</Link>
<Link to="experience" spy={true} smooth={true}>
<li>
Experience
</li>
</Link>
<Link to="portfolio" spy={true} smooth={true}>
<li>
Portfolio
</li>
</Link>
<Link to="testimonial" spy={true} smooth={true}>
<li>
Testimonial
</li>
</Link>
<div className="menu-wrapper" onClick={() => {setshowMenu(!showMenu); setcloseBar(!closeBar);}}>
<div className="menu_button" id={showMenu ? "close" : ""}>
<div className="bars"></div>
</div>
</div>
</ul>
</div>
{/* Mobile Nav */}
<div className="mobile-nav" id={closeBar ? "open" : ""}>
<ul className="mobile-lists">
<Link activeClass="active" to="Navbar" spy={true} smooth={true}>
<li>
Home
</li>
</Link>
<Link to="services" spy={true} smooth={true}>
<li>
Services
</li>
</Link>
<Link to="experience" spy={true} smooth={true}>
<li>
Experience
</li>
</Link>
<Link to="portfolio" spy={true} smooth={true}>
<li>
Portfolio
</li>
</Link>
<Link to="testimonial" spy={true} smooth={true}>
<li>
Testimonial
</li>
</Link>
</ul>
<Link to="contact" spy={true} smooth={true}>
<button className="button mobile-nav-button">Contact</button>
</Link>
</div>
<Link to="contact" spy={true} smooth={true}>
<button className="button n-button">Contact</button>
</Link>
</div>
{/* Mobile Nav */}
</div>
);
};