当前位置:首页 > React

React原生实现menu

2026-01-26 23:44:09React

React 原生实现菜单

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

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

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

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>
  );
}

实现下拉菜单

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

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>
  );
}

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

React原生实现menu

标签: Reactmenu
分享给朋友:

相关文章

vue实现menu

vue实现menu

Vue 实现 Menu 组件 基础 Menu 实现 使用 Vue 3 的 Composition API 可以快速实现一个基础的 Menu 组件。以下是一个简单的实现示例: <template…

React如何获取li

React如何获取li

获取单个 <li> 元素 在 React 中,可以通过 ref 直接获取 DOM 元素。使用 useRef 钩子创建引用,并将其绑定到目标 <li> 元素上。 import…

React如何定时刷新

React如何定时刷新

使用setInterval实现定时刷新 在React中,可以通过setInterval在组件挂载时设置定时器,组件卸载时清除定时器。这种方式适用于需要在固定间隔执行某些操作的场景。 import R…

React中如何引入koa

React中如何引入koa

React 中引入 Koa 的方法 React 是前端框架,而 Koa 是 Node.js 的后端框架。通常两者结合使用时,React 作为前端应用运行在浏览器中,Koa 作为后端服务提供 API 接…

React如何刷新当前组件

React如何刷新当前组件

强制刷新当前组件 使用forceUpdate方法可以强制React组件重新渲染,即使状态或属性未发生变化。这种方法应谨慎使用,通常仅在直接修改了类组件的实例属性时使用。 this.forceUpd…

React如何保持登录状态

React如何保持登录状态

使用本地存储(localStorage/sessionStorage) 将用户登录凭证(如token)存储在浏览器的localStorage或sessionStorage中。localStorage持…