You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+TypeScript环境下Bootstrap 5.3下拉菜单无法展开问题

Bootstrap 5.3下拉菜单无法展开的问题

我是编程与Web开发新手,尝试在导航栏中添加Bootstrap 5.3下拉菜单,但菜单无法展开。已导入Bootstrap的CSS和bundle文件,也检查过Popper是否安装。

import 'bootstrap/dist/css/bootstrap.min.css';
import 'bootstrap/dist/js/bootstrap.bundle.min.js';

export default function Dropdown() {
    return (
            <div className="dropdown">
                <button className="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
                    Dropdown button
                </button>
                <ul className="dropdown-menu">
                    <li><a className="dropdown-item" href="#">Action</a></li>
                    <li><a className="dropdown-item" href="#">Another action</a></li>
                    <li><a className="dropdown-item" href="#">Something else here</a></li>
                </ul>
            </div>
    );
}
import 'bootstrap/dist/css/bootstrap.min.css';
import 'bootstrap/dist/js/bootstrap.bundle.min.js';
import './Navbar.css';
import { NavLink } from 'react-router-dom';
import SignUp from './SignUp';
import Login from './Login';
import AuthContext from '../context/AuthProvider';
import { useContext } from 'react';
import DropdownUser from '../pages/DebtPage/DropdownUser';

export default function Navbar() {
    const {auth} = useContext(AuthContext)

    return (
            <nav className="navbar navbar-expand-lg">
                <div className="container-fluid justify-content-center">
                    <a className="navbar-brand" href="#">OweSmart</a>
                    <button className="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
                        <span className="navbar-toggler-icon"></span>
                    </button>
                    <div className="navbar-nav collapse navbar-collapse" id="navbarNavAltMarkup">
                        <NavLink to="/#" style={{ textDecoration: "none" }} className="nav-link">
                            <li className="nav-item">
                                Home
                            </li>
                        </NavLink>
                        <NavLink to="/ContactPage" style={{ textDecoration: "none" }} className="nav-link">
                            <li className="nav-item">
                                Contacts
                            </li>
                        </NavLink>
                        <NavLink to="/DebtPage" style={{ textDecoration: "none" }} className="nav-link">
                            <li className="nav-item">
                                Debts
                            </li>
                        </NavLink>
                    </div>
                    <DropdownUser></DropdownUser>
                    {auth.id ? (
                        <div className='username'>
                        {auth.username}
                    </div>
                    ) : (
                        <div>
                        <Login></Login>
                    </div>
                    )
                    }
                    <div className='btn-nav'>
                        <SignUp
                            signupText="Sign Up"
                            customeButtonClass="btn-signup-navbar"
                        ></SignUp>
                    </div>
                </div>
            </nav>
    )
}

已尝试的解决方法

我试过检查Popper安装情况、手动设置EventListener,还试过给按钮和ul元素添加ID,但都无效,修改后的代码如下:

<div className="dropdown">
            <button className="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="collapse" aria-expanded="false" id="thing1" data-bs-target="thing2">
                Dropdown button
            </button>
            <ul className="dropdown-menu" id="thing2" aria-labelledby="thing1">
                <li><a className="dropdown-item" href="#">Action</a></li>
                <li><a className="dropdown-item" href="#">Another action</a></li>
                <li><a className="dropdown-item" href="#">Something else here</a></li>
            </ul>
        </div>

问题排查与解决方案

1. 移除重复的Bootstrap JS导入

你的Dropdown和Navbar组件都导入了bootstrap.bundle.min.js,重复加载会破坏Bootstrap的初始化逻辑。只在项目入口文件(比如index.js/App.js)中导入一次,所有组件内不要再重复导入。

2. 修正下拉菜单的属性错误

你修改后的代码把data-bs-toggle="dropdown"改成了collapse,这是错误的——collapse用于折叠面板,下拉菜单必须用dropdown作为data-bs-toggle的值;同时data-bs-target需要加#前缀(比如#thing2)才能正确定位目标元素。

修正后的Dropdown代码:

<div className="dropdown">
  <button className="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false" id="thing1">
    Dropdown button
  </button>
  <ul className="dropdown-menu" id="thing2" aria-labelledby="thing1">
    <li><a className="dropdown-item" href="#">Action</a></li>
    <li><a className="dropdown-item" href="#">Another action</a></li>
    <li><a className="dropdown-item" href="#">Something else here</a></li>
  </ul>
</div>

3. 手动初始化下拉菜单(React专属)

如果上述修改后仍无效,可能是React的DOM更新机制导致Bootstrap无法自动初始化组件。可以在组件挂载时手动初始化:

import { useEffect, useRef } from 'react';
import 'bootstrap/dist/css/bootstrap.min.css';

export default function Dropdown() {
  const dropdownRef = useRef(null);

  useEffect(() => {
    const dropdown = new window.bootstrap.Dropdown(dropdownRef.current);
    return () => dropdown.dispose();
  }, []);

  return (
    <div className="dropdown" ref={dropdownRef}>
      <button className="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
        Dropdown button
      </button>
      <ul className="dropdown-menu">
        <li><a className="dropdown-item" href="#">Action</a></li>
        <li><a className="dropdown-item" href="#">Another action</a></li>
        <li><a className="dropdown-item" href="#">Something else here</a></li>
      </ul>
    </div>
  );
}

4. 检查Navbar布局上下文

确保<DropdownUser>放在navbar容器内的正确位置,避免被其他元素的overflow属性遮挡,Bootstrap下拉菜单需要父元素提供正确的定位上下文。


内容的提问来源于stack exchange,提问作者Tim Lodes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:25:57