【问题标题】:Dropdown in React using bootstrap 4使用引导程序 4 在 React 中的下拉菜单
【发布时间】:2019-04-24 11:10:34
【问题描述】:

当我单击导航栏中的单个下拉菜单链接时,所有下拉菜单链接也会显示或显示。如何通过只显示一个下拉菜单链接来解决此问题?

我已尝试更改指向 aria-labelledby 的 id 值

这是我的应用程序的状态

      state = {
        dropDown: false
      };


      handleDropdown = e => {
            this.setState({ dropDown: !this.state.dropDown });
        };

渲染函数内部

      render() {
        const { dropDown } = this.state;

      /*Conditional statement to select a class base on the state*/

      const dropMenu = dropDown ? 'dropdown-menu show' : 'dropdown-menu';

      /*The two dropdown menu list the displays(both) even when one is clicked*/

    <li className="nav-item dropdown">
                      <Link
                        onClick={this.handleDropdown}
                        className="nav-link dropdown-toggle"
                        href="#"
                        id="navbarDropdown"
                        role="button"
                        data-toggle="dropdown"
                        aria-haspopup="true"
                        aria-expanded="false"
                      >
                        Dropdown
                      </Link>
                      <div className={dropMenu} aria-labelledby="navbarDropdown">
                        <Link className="dropdown-item" to="#">
                          Action
                        </Link>
                        <Link className="dropdown-item" to="#">
                          Another action
                        </Link>
                        <div className="dropdown-divider" />
                        <Link className="dropdown-item" to="#">
                          Something else here
                        </Link>
                      </div>
                    </li>

    <li className="nav-item dropdown">
                      <Link
                        onClick={this.handleDropdown}
                        className="nav-link dropdown-toggle"
                        href="#"
                        id="navbarDropdown"
                        role="button"
                        data-toggle="dropdown"
                        aria-haspopup="true"
                        aria-expanded="false"
                      >
                        Dropdown
                      </Link>
                      <div className={dropMenu} aria-labelledby="navbarDropdown">
                        <Link className="dropdown-item" to="#">
                          Action
                        </Link>
                        <Link className="dropdown-item" to="#">
                          Another action
                        </Link>
                        <div className="dropdown-divider" />
                        <Link className="dropdown-item" to="#">
                          Something else here
                        </Link>
                      </div>
                    </li>
      };

【问题讨论】:

  • 作为替代你手写的,你应该使用别人的代码。 reactstrap.github.io/components/navs 这包含了所有 Bootstrap 4 菜单。
  • 感谢您的资源。但是在这个项目中,我想使用 Bootstrap 作为依赖,而不是使用像 react-bootstrap 这样的 Bootstrap 包

标签: javascript reactjs bootstrap-4


【解决方案1】:

因为您只有 1 个状态来处理显示和隐藏下拉菜单。尝试这样做:

state = {
  dropDown: {
    link1: false,
    link2: false,
  }
}

handleDropdown = e => {
  const { id } = e.target;

  this.setState(prevState => ({
    dropDown : {
      ...prevState.dropDown,
      [id]: !prevState.dropDown[id],
    }
  }));
}

render() {

const { dropDown } = this.state;

      /*Conditional statement to select a class base on the state*/

      const dropMenu = dropDown ? 'dropdown-menu show' : 'dropdown-menu';

      /*The two dropdown menu list the displays(both) even when one is clicked*/

    <li className="nav-item dropdown">
                      <Link
                        onClick={this.handleDropdown}
                        className="nav-link dropdown-toggle"
                        href="#"
                        id="link1" // name your id same as the variable from state dropDown
                        role="button"
                        data-toggle="dropdown"
                        aria-haspopup="true"
                        aria-expanded="false"
                      >
                        Dropdown
                      </Link>
                      <div className={`dropdown-menu ${dropDown.link1 ? 'show' : ''}`} aria-labelledby="navbarDropdown">
                        <Link className="dropdown-item" to="#">
                          Action
                        </Link>
                        <Link className="dropdown-item" to="#">
                          Another action
                        </Link>
                        <div className="dropdown-divider" />
                        <Link className="dropdown-item" to="#">
                          Something else here
                        </Link>
                      </div>
                    </li>

    <li className="nav-item dropdown">
                      <Link
                        onClick={this.handleDropdown}
                        className="nav-link dropdown-toggle"
                        href="#"
                        id="link2" // name your id same as the variable from state dropDown
                        role="button"
                        data-toggle="dropdown"
                        aria-haspopup="true"
                        aria-expanded="false"
                      >
                        Dropdown
                      </Link>
                      <div className={`dropdown-menu ${dropDown.link2 ? 'show' : ''}`} aria-labelledby="navbarDropdown">
                        <Link className="dropdown-item" to="#">
                          Action
                        </Link>
                        <Link className="dropdown-item" to="#">
                          Another action
                        </Link>
                        <div className="dropdown-divider" />
                        <Link className="dropdown-item" to="#">
                          Something else here
                        </Link>
                      </div>
                    </li>
}

希望它有效。

【讨论】:

    【解决方案2】:

    更新代码

    改变状态变量如下:

    state = {
      dropDownState: [false, false]
    };
    

    由于您只有两个li &gt; div,因此该数组包含两个元素,如果菜单项增加,则也增加它们。

    那么 div 的样子

    &lt;div className={dropMenu[0]} aria-labelledby="navbarDropdown"&gt;&lt;div className={dropMenu[1]} aria-labelledby="navbarDropdown"&gt;

    每个函数绑定看起来像

    onClick={() => this.handleDropdown(0)}
    onClick={() => this.handleDropdown(1)}
    

    然后实际的函数将变为

    handleDropdown = (menuIndex) => {
       let newMenuState = this.state.dropDownState.map((val, index) => {
           if(index === menuIndex) {
               return !val
           } else return val
       });
    
      this.setState({ dropDownState: newMenuState })
    };
    

    请注意我没有运行代码,但你应该明白了。

    旧答案

    不调用函数,而是将值绑定到函数:

    改变

    onClick={this.handleDropdown}

    onClick={() =&gt; this.handleDropdown()}

    【讨论】:

    • 我试过绑定方法,但还是调用了两个下拉菜单链接
    • 你在哪里使用 const const dropMenu?我在其他任何地方的代码中都没有看到它。您不需要将其用作每个li 中的 div 类吗?不仅如此,单个状态变量决定了类,然后影响每个lis 内的所有 div(在应用 const 作为 div 的类之后)。您需要使用数组使其动态化。每个数组元素都将保存每个li &gt; div 的状态。
    • 哎呀,对不起。我刚刚编辑了代码。没错,我在li里面的div上使用了dropMenu,问题依旧存在。请,我没有得到我需要让它动态的路径。因为 const dropMenu 根据 render 函数 中 dropDown 的状态持有类。感谢您的宝贵时间。
    • 我正在接近解决方案。我在更新代码中的 div 元素中使用了 console.log(dropMenu[0]) 并得到了类的第一个字母 d (即下拉菜单)。
    • &lt;div className={dropMenu[0]} aria-labelledby="navbarDropdown"&gt; 更改为&lt;div className={this.state.dropDownState[0]} aria-labelledby="navbarDropdown"&gt;,抱歉我错过了那部分。基本上使用新状态变量中的数组元素。
    猜你喜欢
    • 2019-01-27
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多