当前位置:首页 > 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 控制:

.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:

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 菜单库:

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
分享给朋友:

相关文章

如何学习react

如何学习react

学习 React 的步骤 理解基础概念 React 是一个用于构建用户界面的 JavaScript 库。学习 React 之前,建议掌握 JavaScript 的基础知识,包括 ES6+ 语法(如箭头…

react如何浮动

react如何浮动

使用 CSS 实现浮动 在 React 中实现浮动效果可以通过 CSS 的 float 属性完成。在组件的样式文件或内联样式中直接设置 float: left 或 float: right。 /…

理解如何react

理解如何react

理解React的核心概念 React是一个用于构建用户界面的JavaScript库,专注于通过组件化开发提高代码的可维护性和复用性。其核心思想包括虚拟DOM(Virtual DOM)和单向数据流,能够…

如何用react

如何用react

使用React的基本步骤 安装Node.js和npm 确保系统已安装Node.js和npm。Node.js自带npm,可从官网下载安装包。安装完成后,通过命令行验证版本: node -v npm -…

react如何重置

react如何重置

重置 React 应用的状态 使用 useState 钩子重新初始化状态变量是最直接的方法。将状态变量重置为初始值或空值即可完成重置。 const [count, setCount] = useSt…

react如何清理

react如何清理

清理 React 项目的方法 清理未使用的依赖项 运行 npm prune 或 yarn install --production 可以移除 node_modules 中未在 package.json…