当前位置:首页 > React

React原生实现menu

2026-01-26 23:44:09React

React 原生实现菜单

在React中实现菜单功能可以通过多种方式完成,以下是几种常见的方法:

使用状态管理控制菜单显示

通过React的useState钩子管理菜单的显示状态,结合点击事件触发状态变化:

React原生实现menu

import React, { useState } from 'react';

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

  return (
    <div>
      <button onClick={() => setIsOpen(!isOpen)}>Toggle Menu</button>
      {isOpen && (
        <ul>
          <li>Item 1</li>
          <li>Item 2</li>
          <li>Item 3</li>
        </ul>
      )}
    </div>
  );
}

添加动画效果

使用CSS过渡或动画库如react-transition-group为菜单添加平滑的显示/隐藏效果:

import { CSSTransition } from 'react-transition-group';

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

  return (
    <div>
      <button onClick={() => setIsOpen(!isOpen)}>Toggle Menu</button>
      <CSSTransition
        in={isOpen}
        timeout={300}
        classNames="menu"
        unmountOnExit
      >
        <ul className="menu">
          <li>Item 1</li>
          <li>Item 2</li>
          <li>Item 3</li>
        </ul>
      </CSSTransition>
    </div>
  );
}

实现下拉菜单

创建一个更复杂的下拉菜单组件,包含子菜单项和点击外部区域关闭功能:

React原生实现menu

import React, { useState, useRef, useEffect } from 'react';

function DropdownMenu() {
  const [isOpen, setIsOpen] = useState(false);
  const dropdownRef = useRef(null);

  useEffect(() => {
    function handleClickOutside(event) {
      if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
        setIsOpen(false);
      }
    }
    document.addEventListener('mousedown', handleClickOutside);
    return () => document.removeEventListener('mousedown', handleClickOutside);
  }, []);

  return (
    <div ref={dropdownRef} className="dropdown">
      <button onClick={() => setIsOpen(!isOpen)}>Dropdown</button>
      {isOpen && (
        <div className="dropdown-content">
          <a href="#">Link 1</a>
          <a href="#">Link 2</a>
          <a href="#">Link 3</a>
        </div>
      )}
    </div>
  );
}

响应式导航菜单

实现一个响应式的导航菜单,在小屏幕上显示汉堡菜单图标:

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

  return (
    <nav className="navbar">
      <div className="navbar-brand">
        <button 
          className="menu-icon" 
          onClick={() => setIsOpen(!isOpen)}
        >
          ☰
        </button>
      </div>
      <div className={`navbar-links ${isOpen ? 'active' : ''}`}>
        <a href="/">Home</a>
        <a href="/about">About</a>
        <a href="/contact">Contact</a>
      </div>
    </nav>
  );
}

可访问性考虑

确保菜单具有良好的可访问性,包括键盘导航和ARIA属性:

function AccessibleMenu() {
  const [isOpen, setIsOpen] = useState(false);
  const menuRef = useRef(null);

  function handleKeyDown(e) {
    if (e.key === 'Escape') {
      setIsOpen(false);
    }
  }

  return (
    <div 
      ref={menuRef} 
      onKeyDown={handleKeyDown}
      aria-haspopup="true"
      aria-expanded={isOpen}
    >
      <button 
        onClick={() => setIsOpen(!isOpen)}
        aria-controls="menu-list"
      >
        Menu
      </button>
      {isOpen && (
        <ul id="menu-list" role="menu">
          <li role="menuitem" tabIndex="0">Option 1</li>
          <li role="menuitem" tabIndex="0">Option 2</li>
          <li role="menuitem" tabIndex="0">Option 3</li>
        </ul>
      )}
    </div>
  );
}

这些实现方法可以根据具体需求进行组合和扩展,创建出功能完善、用户体验良好的菜单组件。

标签: Reactmenu
分享给朋友:

相关文章

React如何创建store

React如何创建store

创建 Redux Store 的基本步骤 安装 Redux 和 React-Redux 依赖包: npm install redux react-redux 创建 reducer 函数管理状态:…

React如何让modal可以被拖动

React如何让modal可以被拖动

实现可拖动Modal的方法 在React中实现可拖动的Modal,可以通过结合HTML5的拖拽API或第三方库如react-draggable来完成。以下是两种常用方法的详细说明: 使用react-…

React的热更新如何做

React的热更新如何做

React热更新配置方法 使用Webpack的Hot Module Replacement (HMR)功能实现React组件热更新。确保项目已安装webpack-dev-server和react-ho…

React实现打印word

React实现打印word

使用React实现打印Word文档 在React中实现打印Word文档功能,可以通过以下几种方法实现: 方法一:使用第三方库react-to-print 安装react-to-print库: n…

React实现文档预览

React实现文档预览

实现文档预览的方法 在React中实现文档预览可以通过多种方式完成,具体取决于文档类型和需求。以下是几种常见的方法: 使用第三方库预览PDF 安装react-pdf库,该库专门用于在React中渲染…

步骤条React实现

步骤条React实现

React 实现步骤条的方法 使用 React 实现步骤条可以通过多种方式完成,以下是几种常见的方法: 使用状态管理控制步骤 通过 React 的 useState 钩子管理当前步骤的状态,动态渲染…