React响应式导航栏和汉堡菜单

3

我需要制作响应式的React导航栏。我找到一些在HTML中可以工作的方法,但在React中却不行。我认为问题出在getElementById上,因为React不支持它。

import React from "react";
import { Link } from "react-router-dom";
import "./index.css";

function myFunction() {
  var x = document.getElementById("myTopnav");
  if (x.className === "topnav") {
    x.className += " responsive";
  } else {
    x.className = "topnav";
  }
}
function Header() {
  return (
    <nav>
      <div className="topnav" id="myTopnav">
        <a href="#home" className="active">
          Home
        </a>
        <a href="#news">News</a>
        <a href="#contact">Contact</a>
        <a href="#about">About</a>
        <a href="javascript:void(0);" className="icon" onclick={myFunction}>
          <i className="fa fa-bars"></i>
        </a>
      </div>
    </nav>
  );
}

export default Header;

这是我的项目使用的CSS:

.topnav {
  overflow: hidden;
  background-color: black;
}

.topnav a {
  float: left;
  display: block;
  color: #f2f2f2;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
  font-size: 17px;
}

.topnav a:hover {
  background-color: #ddd;
  color: black;
}

.topnav .icon {
  display: none;
}

@media screen and (max-width: 600px) {
  .topnav a {
    display: none;
  }
  .topnav a.icon {
    float: right;
    display: block;
  }
}

@media screen and (max-width: 600px) {
  .topnav.responsive {
    position: relative;
  }
  .topnav.responsive .icon {
    position: absolute;
    right: 0;
    top: 0;
  }
  .topnav.responsive a {
    float: none;
    display: block;
    text-align: left;
  }
}

我该如何更新我的React代码,才能在单击图标时显示响应式菜单?


请将您的完整代码粘贴在下面。 - Rashed Rahat
我在回答中发布CSS,因为stackoverflow不允许我发布太多代码。 - jvzznjs
我已经添加了一个答案。 - Rashed Rahat
更新了我的回答,请查看。 - Rashed Rahat
2个回答

2

已更新

myFunction()放置于Header()中,因为这是一个基于函数的组件。

以下是更改后的Header组件外观:

import React from "react";
import { Link } from "react-router-dom";
import "./index.css";

function Header() {
  const myFunction = () => {
    var x = document.getElementById("myTopnav");
    if (x.className === "topnav") {
      x.className += " responsive";
    } else {
      x.className = "topnav";
    }
  }

  return (
    <nav>
      <div className="topnav" id="myTopnav">
        <a href="#home" className="active">
          Home
        </a>
        <a href="#news">News</a>
        <a href="#contact">Contact</a>
        <a href="#about">About</a>
        <a href="javascript:void(0);" className="icon" onClick={myFunction}>
          <i className="fa fa-bars"></i>
        </a>
      </div>
    </nav>
  );
}

export default Header;

请访问此链接以查看:Code Sandbox Live Demo

我已经在沙盒上更新了我的代码,请查看:https://codesandbox.io/s/magical-sun-dtxol?file=/src/App.js - Rashed Rahat
你有检查过吗?@jvzznjs - Rashed Rahat

1
如果您使用useState hook来管理组件,而不是直接使用javascript修改DOM,那么以后您可能会遇到较少的问题。
import React, { useState } from 'react';

const Header = () => {
  // set a variable 'responsive' to false. Update it using 'setResponsive'
  const [responsive, setResponsive] = useState(false);

  const toggleResponsive = () => {
    //take current value of responsive and flip it
    setResponsive(prev => !prev);
  }

  return (
    <nav>
      <div className={responsive ? 'topnav responsive' : 'topnav'}>
        <a href='#home'>Home</a>
        ...
        <a className='icon' onClick={toggleResponsive}>
          <i className="fa fa-bars"></i>
        </a>
      </div>
    </nav>
  );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接