将 CSS 和 HTML 汉堡菜单转换为 React 组件

Converting CSS and HTML hamburger menu into a react component

我正在学习使用 css、html 和 javascript 创建动画导航栏和汉堡菜单的教程,我想创建导航栏作为我的反应组件项目。

我试图隐藏的代码如下,它是一个 app.js 文件,嵌入在 html 中,带有标签:

const navSlide = () => {
    const burger = document.querySelector('.burger');
    const nav = document.querySelector('.nav-links');

    burger.addEventListener('click', () => {
        nav.classList.toggle('nav-active');
    })
}

navSlide();

我已尝试将此代码实现到我的导航栏反应组件中,如下所示:

import React from "react";

const NavBar = () => {
const nav = document.querySelector(".nav-links");

  return (
    <div className="navbar">
        <nav>
            <ul className="nav-links">
                <li>
                    <a href="#">Menu Item</a>
                </li>
            </ul>
        <div
            className="burger"
            onClick={() => {
                nav.classList.toggle("nav-active");
            }}
        >
          <div className="line1" />
          <div className="line2" />
          <div className="line3" />
        </div>
       </nav>
    </div>
  );
};

export default NavBar;

然而这个returns的错误是: "TypeError: Cannot read property 'classList' of null"

.nav-active的CSS如下:

.nav-active {
  transform: translateX(0%);
}

我期望的结果是导航栏在单击汉堡符号时切换打开和关闭

最好的选择是与状态一起使用。这应该有效,但尚未测试。 useState 挂钩需要 ReactJS 16.8。

import React, {useState} from "react";

const NavBar = () => {
  const [navOpened, setNavOpened] = useState(false);
  const navClassNames = navOpened ? 'nav-links nav-active' : 'nav-links';

  return (
    <div className="navbar">
        <nav>
            <ul className={navClassNames}>
                <li>
                    <a href="#">Menu Item</a>
                </li>
            </ul>
        <div
            className="burger"
            onClick={() => setNavOpened(!navOpened)}
        >
          <div className="line1" />
          <div className="line2" />
          <div className="line3" />
        </div>
       </nav>
    </div>
  );
};

要引用您应该使用 ref 的 DOM 元素,您可以使用 useRef 挂钩 docs.

import React, { useRef } from "react";

const NavBar = () => {

  const nav = useRef(null);  // initial value of ref null

  return (
    <div className="navbar">
        <nav>
            <ul className="nav-links" ref={nav}>  {/* Put the ref in your JSX */}
                <li>
                    <a href="#">Menu Item</a>
                </li>
            </ul>
        <div
            className="burger"
            onClick={() => {
                nav.current.classList.toggle("nav-active");  // Now you can use the ref here, current is required to get the current value of the ref
            }}
        >
          <div className="line1" />
          <div className="line2" />
          <div className="line3" />
        </div>
       </nav>
    </div>
  );
};

export default NavBar;