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

React环境下实现AppBar内不同菜单切换功能的方法咨询

实现React AppBar多图标按钮对应菜单的互斥展开效果

核心实现逻辑是用单一状态统一管控所有菜单的展开状态,避免给每个菜单单独声明独立的开关状态,天然实现菜单之间的互斥切换效果。

实现步骤

  • 第一步:给每个图标对应的菜单分配唯一标识(可以是字符串、数字类型),声明状态存储当前处于展开状态的菜单标识
import { useState } from 'react';
// 假设四个菜单分别对应:主菜单、通知、用户中心、设置
const MENU_IDS = {
  MAIN: 'main',
  NOTIFICATION: 'notification',
  USER: 'user',
  SETTING: 'setting'
}

function App() {
  // 初始值为null表示所有菜单都关闭
  const [activeMenuId, setActiveMenuId] = useState(null);
  • 第二步:封装统一的菜单切换处理函数
const toggleMenu = (targetMenuId) => {
    // 如果点击的是当前已经展开的菜单,就关闭菜单;否则切换为点击的菜单
    setActiveMenuId(prevId => prevId === targetMenuId ? null : targetMenuId);
  }

  // 点击菜单外部/点击菜单项后关闭所有菜单的公共方法
  const closeAllMenu = () => {
    setActiveMenuId(null);
  }
  • 第三步:给图标按钮和菜单组件绑定对应属性
return (
    <AppBar position="static">
      <Toolbar>
        {/* 第一个图标按钮 */}
        <IconButton onClick={() => toggleMenu(MENU_IDS.MAIN)}>
          <MenuIcon />
        </IconButton>
        {/* 第一个菜单 */}
        <Menu
          open={activeMenuId === MENU_IDS.MAIN}
          onClose={closeAllMenu}
          // 其他Menu属性如anchorEl按需添加
        >
          <MenuItem onClick={closeAllMenu}>首页</MenuItem>
          <MenuItem onClick={closeAllMenu}>分类</MenuItem>
        </Menu>

        {/* 第二个图标按钮 */}
        <IconButton onClick={() => toggleMenu(MENU_IDS.NOTIFICATION)}>
          <NotificationsIcon />
        </IconButton>
        {/* 第二个菜单 */}
        <Menu
          open={activeMenuId === MENU_IDS.NOTIFICATION}
          onClose={closeAllMenu}
        >
          <MenuItem onClick={closeAllMenu}>通知1</MenuItem>
          <MenuItem onClick={closeAllMenu}>通知2</MenuItem>
        </Menu>

        {/* 剩余两个图标和菜单按照相同逻辑绑定即可 */}
      </Toolbar>
    </AppBar>
  )
}

注意事项

  • 所有菜单的唯一标识不能重复,否则会出现多个菜单同时展开的问题
  • 如果使用的是其他UI库的Menu组件,只需要把open属性替换为对应UI库控制显隐的属性即可,逻辑完全通用
  • 该方案没有多余的状态声明,每次状态更新只会触发相关菜单的显隐切换,性能开销极低

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

相关产品推荐
方舟 Agent Plan

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

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