当前位置:首页 > React

react实现菜单

2026-01-26 15:35:46React

使用 React 实现菜单功能

使用状态管理控制菜单展开/收起

通过 useState 管理菜单的展开状态,点击按钮切换状态:

import { useState } from 'react';

function Menu() {
  const [isOpen, setIsOpen] = useState(false);

  return (
    <div>
      <button onClick={() => setIsOpen(!isOpen)}>
        {isOpen ? '收起菜单' : '展开菜单'}
      </button>
      {isOpen && (
        <ul>
          <li>菜单项1</li>
          <li>菜单项2</li>
          <li>菜单项3</li>
        </ul>
      )}
    </div>
  );
}

使用 CSS 实现动画效果

为菜单添加过渡动画效果,通过 CSS 控制:

react实现菜单

.menu {
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.3s ease-out;
}

.menu.open {
  max-height: 500px;
}

递归实现多级菜单

处理嵌套菜单结构时使用递归组件:

function MenuItem({ item }) {
  const [isOpen, setIsOpen] = useState(false);

  return (
    <li>
      <div onClick={() => setIsOpen(!isOpen)}>
        {item.name}
        {item.children && <span>{isOpen ? '↑' : '↓'}</span>}
      </div>
      {item.children && isOpen && (
        <ul>
          {item.children.map(child => (
            <MenuItem key={child.id} item={child} />
          ))}
        </ul>
      )}
    </li>
  );
}

使用 Context 实现全局菜单状态

跨组件共享菜单状态时使用 Context API:

react实现菜单

const MenuContext = createContext();

function MenuProvider({ children }) {
  const [activeMenu, setActiveMenu] = useState(null);

  return (
    <MenuContext.Provider value={{ activeMenu, setActiveMenu }}>
      {children}
    </MenuContext.Provider>
  );
}

function MenuItem({ id, children }) {
  const { activeMenu, setActiveMenu } = useContext(MenuContext);

  return (
    <li 
      className={activeMenu === id ? 'active' : ''}
      onClick={() => setActiveMenu(id)}
    >
      {children}
    </li>
  );
}

响应式菜单实现

根据屏幕尺寸自动切换菜单模式:

function ResponsiveMenu() {
  const [isMobile, setIsMobile] = useState(false);
  const [showMenu, setShowMenu] = useState(false);

  useEffect(() => {
    const handleResize = () => {
      setIsMobile(window.innerWidth < 768);
    };
    handleResize();
    window.addEventListener('resize', handleResize);
    return () => window.removeEventListener('resize', handleResize);
  }, []);

  return (
    <div>
      {isMobile ? (
        <button onClick={() => setShowMenu(!showMenu)}>菜单</button>
      ) : (
        <ul className="desktop-menu">
          {/* 桌面菜单项 */}
        </ul>
      )}

      {isMobile && showMenu && (
        <ul className="mobile-menu">
          {/* 移动菜单项 */}
        </ul>
      )}
    </div>
  );
}

使用第三方库实现复杂菜单

对于复杂需求可以使用现成的 React 菜单库:

npm install react-contextmenu
import { ContextMenu, MenuItem } from 'react-contextmenu';

function App() {
  return (
    <div>
      <div id="target">右键点击这里</div>
      <ContextMenu id="menu_id">
        <MenuItem onClick={() => alert('操作1')}>操作1</MenuItem>
        <MenuItem onClick={() => alert('操作2')}>操作2</MenuItem>
      </ContextMenu>
    </div>
  );
}

标签: 菜单react
分享给朋友:

相关文章

如何制作css导航菜单

如何制作css导航菜单

创建基本HTML结构 导航菜单的基础是HTML结构。使用<nav>标签包裹无序列表<ul>,每个菜单项用<li>标签表示,链接用<a>标签。 <…

react中monent如何获取日期

react中monent如何获取日期

使用 Moment.js 获取当前日期 在 React 中通过 Moment.js 获取当前日期,可以直接调用 moment() 函数。它会返回包含当前日期和时间的 Moment 对象。 impor…

如何优化react

如何优化react

优化 React 性能的方法 使用 React.memo 或 PureComponent 对于函数组件,使用 React.memo 进行记忆化,避免不必要的重新渲染。类组件可以使用 PureCompo…

react如何更新

react如何更新

更新 React 版本的方法 检查当前 React 版本 运行以下命令查看项目中安装的 React 版本: npm list react 更新 React 及相关依赖 通过 npm 或 yarn…

react如何衰减

react如何衰减

React 中的动画衰减效果实现 在 React 中实现衰减效果(如滚动衰减、拖动释放后的惯性滑动)通常需要结合物理动画原理或第三方动画库。以下是几种常见方法: 使用 CSS 动画和 @keyfra…

react如何收录

react如何收录

React 收录方法 React 的收录主要涉及搜索引擎优化(SEO)和预渲染技术。由于 React 是单页应用(SPA),默认情况下内容由 JavaScript 动态生成,可能导致搜索引擎爬虫难以收…