【问题标题】:Trouble making dropdown buttons within navbar clickable in react在反应中无法点击导航栏中的下拉按钮
【发布时间】:2019-11-08 03:04:59
【问题描述】:

我设法让按钮激活一个下拉菜单,当您单击关闭时会消失,但问题是当您单击任何按钮时,所有下拉菜单都会出现。似乎当我尝试设置一个按钮的状态时,它会设置所有按钮的状态。我希望每个按钮的状态都有一个为真或假的 displayMenu 变量。单击按钮时,应将其 displayMenu 状态更改为 true,单击关闭时更改为 false。我在这里做错了什么?

import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import './NavBar.css'; 
import './Body.css'
class NavBar extends Component {
  state = {
    displayMenu: false 
  }

  showDM = () => {
    const displayMenu = true;
    this.setState({ displayMenu }, () => {
      document.addEventListener('click', this.hideDM);
      //document.getElementById("ddc").classList.toggle('show');
    });
  }

  hideDM = (ev) => {
    this.setState({ displayMenu: false }, () => {
      document.removeEventListener('click', this.hideDM)
      //document.getElementsByClassName("dropdown-content").classList.remove('show');

    });
  }

  render() {
    return (
      <header>
        <div className="navbar">
          <div className="dropdown">
            <button onClick={this.showDM} className="dropbtn">About 
              <i className="fa fa-caret-down"></i>
            </button>
            { this.state.displayMenu ? ( 
            <div className="dropdown-content" id="ddc">
              <a href="#mission"><Link to="/mission">Mission</Link></a>
              <a href="#history"><Link to="/history">History</Link></a>
              <a href="#alumni"><Link to="/alumni">Alumni</Link></a>
            </div>
            ):
            ( 
              null 
            )
            }
          </div>
          <div className="dropdown">
            <button onClick={this.showDM} className="dropbtn">Academics 
              <i className="fa fa-caret-down"></i>
            </button>
            { this.state.displayMenu ? (
            <div className="dropdown-content" id="ddc">


              <a href="#curriculum"><Link to="/curriculum">Our Curriculum</Link></a>
              <a href="#study-abroad"><Link to="/study-abroad">Study Abroad</Link></a>
            </div>
            ):
            ( 
              null 
            )
            }
          </div> 

}
export default NavBar;

【问题讨论】:

    标签: javascript html reactjs web


    【解决方案1】:

    您可以将每个按钮的不同类型发送到您的函数并更改该按钮的状态。

    <button onClick={this.showDM("About")} className="dropbtn">About 
        <i className="fa fa-caret-down"></i>
    </button>
    

    关于showDM功能

    showDM = (type) => {
    const displayMenu = true;
    this.setState({ displayMenu: type });}
    

    对于您的下拉内容,您可以检查状态是否等于其自己的类型

    { this.state.displayMenu === "About" ? ( 
       <div className="dropdown-content" id="ddc">
         <a href="#mission"><Link to="/mission">Mission</Link></a>
         <a href="#history"><Link to="/history">History</Link></a>
         <a href="#alumni"><Link to="/alumni">Alumni</Link></a>
       </div>
       ):
       ( 
         null 
        )}
    

    你的 hideDM 功能也可以是这样的

    hideDM = (ev) => {
    this.setState({ displayMenu: ""});}
    

    【讨论】:

      【解决方案2】:

      您检查多个按钮的相同值:this.state.displayMenu。我建议向您的状态添加另一个值并对其进行检查,例如displayWhich 或其他任何值,然后根据单击的按钮进行设置。有了这个,您还可以删除再次隐藏菜单的功能:

      我稍微改变了结构,希望cmets描述的足够多,否则,请随意询问!

      class NavBar extends Component {
        //added constructor for state and binding. you don't need to, but i like it better this way 
        constructor(){
          super();
          this.state =  {
            displayMenu: false, 
            displayWhich: -1
          }
          this.MenuClick = this.MenuClick.bind(this);
        }
      
      
        MenuClick(e) => {
          // i use a dom-attribute here, you could also use refs or something different. this is for breviety 
          let target = e.currentTarget.attr("data-which");
          //we assume that if the target is the same as displayWhich, displayMenu is also  true
          // but you could check for that too
          //also a soft check because dom returns string, but i wanted to use ints for the state
         // could also parse the target-value before and then do a hard check
      
          if(target == this.state.displayWhich){
             this.setState({
             displayMenu: false,
             displayWhich: -1
            })
          }else{
             this.setState({
             displayMenu: true,
             displayWhich:target
            })
          }        
      
        }
      
      
      
        render() {
          return (
            <header>
              <div className="navbar">
                <div className="dropdown">
                  <button onClick={this.menuClick} className="dropbtn" data-which="1">About 
                    <i className="fa fa-caret-down"></i>
                  </button>
                  { ((this.state.displayMenu) && (this.state.displayWhich==1))&&
                   ( 
                  <div className="dropdown-content" id="ddc">
                    <a href="#mission"><Link to="/mission">Mission</Link></a>
                    <a href="#history"><Link to="/history">History</Link></a>
                    <a href="#alumni"><Link to="/alumni">Alumni</Link></a>
                  </div>
                  )}
                </div>
                <div className="dropdown">
                  <button onClick={this.showDM} className="dropbtn">Academics 
                    <i className="fa fa-caret-down"></i>
                  </button>
                  // CHANGED THIS HERE: 
                  // content only displays when condition true, no need to return null
                  // notice (condition) && (content)
                  {  ((this.state.displayMenu) && (this.state.displayWhich==2)) &&
                  (
      
                  <div className="dropdown-content" id="ddc">
      
      
                    <a href="#curriculum"><Link to="/curriculum">Our Curriculum</Link></a>
                    <a href="#study-abroad"><Link to="/study-abroad">Study Abroad</Link></a>
                  </div>
                  )
      
                  }
                </div> 
      
      }
      export default NavBar;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-08
        • 1970-01-01
        • 1970-01-01
        • 2020-12-20
        • 1970-01-01
        • 2015-05-25
        • 1970-01-01
        • 2021-02-28
        相关资源
        最近更新 更多