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

如何在React中使用下拉菜单实现页面的条件渲染

React导航栏下拉菜单与页面切换联动实现方案

你当前代码的核心问题是维护了两套完全独立的导航数据,下拉菜单数据和页面切换逻辑没有关联,只需要统一数据源、关联点击事件即可实现功能。

改造要点

  • 统一导航数据源,将带下拉的导航层级结构定义在App组件中,避免分开维护数据不同步
  • 给下拉菜单组件传入页面切换方法和当前页面状态,让下拉选项点击时可以触发页面切换
  • 合并普通导航项和带下拉导航项的渲染逻辑,减少冗余代码

改造后完整代码

App组件

function App() {
  // 统一导航配置,带children的为有下拉的导航项
  const [navConfig] = useState([
    {
      id: 1,
      name: 'Home',
      children: null
    },
    {
      id: 2,
      name: 'About',
      children: [
        {id: 21, name: 'About Me'},
        {id: 22, name: 'About Tampa Bay'}
      ]
    }
  ])
  // 拍平所有可跳转页面,用于初始化和页面匹配
  const pages = navConfig.flatMap(item => {
    if (item.children) return item.children
    return [item]
  })
  const [currentPage, setCurrentPage] = useState(pages[0])
  return (
    <div>
      <Nav 
        navConfig={navConfig}
        currentPage={currentPage}
        setCurrentPage={setCurrentPage}
      ></Nav>
      <main>
        <Pages currentPage={currentPage}></Pages>
      </main>
    </div>
  );
}
function Nav(props) {
  const { navConfig = [], setCurrentPage, currentPage } = props;
  return (
    <header className="flex-row">
      <h1 class="name-tag">
        <img src={"../../assets/Logo1.png"} alt="站点logo" />
      </h1>
      <nav>
        <ul className="flex-row nav-list">
          {/* 遍历统一的导航配置,普通项直接渲染,带下拉的用NavItems渲染 */}
          {navConfig.map(navItem => (
            !navItem.children ? (
              <li className={`li-spacing text-format ${currentPage.name === navItem.name && 'navActive'}`} key={navItem.id}>
                <span onClick={() => { setCurrentPage(navItem) }}>{navItem.name}</span>
              </li>
            ) : (
              <NavItems 
                key={navItem.id} 
                item={navItem} 
                currentPage={currentPage}
                setCurrentPage={setCurrentPage}
              />
            )
          ))}
        </ul>
      </nav>
    </header>
  )
}
function NavItems(props) {
  const { item, currentPage, setCurrentPage } = props
  return (
    <div className="dropdown">
      <li className="nav-list-item">{ item.name }</li>
      <div className="dropdown-item">
        {item.children.map(subItem => (
          <p 
            key={subItem.id}
            className={currentPage.name === subItem.name ? 'navActive' : ''}
            onClick={() => setCurrentPage(subItem)}
          >
            { subItem.name }
          </p>
        ))}
      </div>
    </div>
  )
}

export default NavItems;

如果你的导航父项(比如About)本身也需要支持点击跳转,直接给对应配置加name匹配的页面即可,无需额外调整逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:45:04