当前位置:首页 > 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
分享给朋友:

相关文章

如何react页面

如何react页面

创建 React 页面 使用 create-react-app 快速初始化项目: npx create-react-app my-app cd my-app npm start 编写组件代码 在…

react如何销毁

react如何销毁

销毁 React 组件 在 React 中,销毁组件通常涉及清理副作用(如事件监听器、定时器或订阅)以防止内存泄漏。以下是实现组件销毁的常见方法: 使用 useEffect 清理副作用 在函数组件…

vue实现左右菜单联动实现

vue实现左右菜单联动实现

Vue 实现左右菜单联动 使用事件总线通信 在 Vue 中可以通过事件总线实现左右菜单的通信。创建一个中央事件总线实例,让左右菜单通过事件监听和触发实现联动。 // eventBus.js impo…

css制作横向菜单

css制作横向菜单

使用浮动(Float)实现横向菜单 将菜单项的 display 属性设置为 float: left,使列表项横向排列。清除浮动避免影响后续布局。 ul.horizontal-menu { lis…

css制作tab菜单

css制作tab菜单

CSS制作Tab菜单的方法 HTML结构 使用无序列表和div容器构建基础结构,列表项为标签页标题,div内放置对应内容块。 <ul class="tab-menu"> <l…

vue实现菜单

vue实现菜单

使用 Vue 实现菜单 Vue 可以轻松实现动态菜单,通常结合路由和组件化思想。以下是一个基于 Vue 3 和 Vue Router 的菜单实现方案: 基础菜单结构 在 Vue 中,菜单通常是一个…