当前位置:首页 > 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 通过虚拟 DOM(Virtual DOM)和高效的 diff 算法优化性能。虚拟 DOM 减少了直接操作真实 DOM 的开销,仅在必要时更新变化的部分。React 的…

如何记忆react

如何记忆react

理解核心概念 React的核心概念包括组件、状态(state)、属性(props)、生命周期方法(类组件)和钩子(函数组件)。掌握这些基础概念是记忆React的关键。组件是React应用的构建块,分为…

react如何验证

react如何验证

表单验证方法 在React中验证表单数据通常使用以下几种方式: 内置HTML5验证 利用HTML5原生表单验证属性如required、pattern等,结合form.noValidate属性禁用浏览…

如何提高react

如何提高react

优化性能 使用React.memo对组件进行记忆化处理,避免不必要的重新渲染。对于类组件,可以使用PureComponent来达到类似效果。 利用useMemo缓存计算结果,避免重复计算。对于函数或…

如何构建react

如何构建react

构建 React 项目的步骤 安装 Node.js 和 npm 确保系统已安装 Node.js(包含 npm)。可通过命令行验证: node -v npm -v 使用 Create React Ap…

react就业如何

react就业如何

React 就业市场现状 React 作为当前主流前端框架之一,就业需求持续旺盛。国内外互联网企业、中大型公司以及初创团队普遍采用 React 技术栈,尤其在 Web 应用、移动端(React Nat…