当前位置:首页 > React

react实现菜单切换

2026-01-26 23:07:03React

使用状态管理实现菜单切换

在React中,可以通过useState钩子管理菜单的展开/折叠状态。定义一个状态变量(如isMenuOpen)和对应的更新函数,通过点击事件切换状态。

import React, { useState } from 'react';

function Menu() {
  const [isMenuOpen, setIsMenuOpen] = useState(false);

  return (
    <div>
      <button onClick={() => setIsMenuOpen(!isMenuOpen)}>
        {isMenuOpen ? '收起菜单' : '展开菜单'}
      </button>
      {isMenuOpen && (
        <ul>
          <li>菜单项1</li>
          <li>菜单项2</li>
        </ul>
      )}
    </div>
  );
}

结合CSS过渡动画

通过CSS类名动态控制菜单的显示与隐藏,并添加过渡效果。定义.menu-active.menu-inactive类,分别对应展开和收起状态。

import React, { useState } from 'react';
import './Menu.css';

function Menu() {
  const [isActive, setIsActive] = useState(false);

  return (
    <div>
      <button onClick={() => setIsActive(!isActive)}>
        切换菜单
      </button>
      <ul className={`menu ${isActive ? 'menu-active' : 'menu-inactive'}`}>
        <li>选项1</li>
        <li>选项2</li>
      </ul>
    </div>
  );
}

CSS示例:

react实现菜单切换

.menu {
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.3s ease-out;
}
.menu-active {
  max-height: 200px;
}

使用第三方库(如React-Transition-Group)

对于复杂的动画效果,可以借助react-transition-group库实现更精细的控制。通过CSSTransition组件包裹菜单内容,定义进入/退出的动画类名。

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

function Menu() {
  const [showMenu, setShowMenu] = useState(false);

  return (
    <div>
      <button onClick={() => setShowMenu(!showMenu)}>
        切换菜单
      </button>
      <CSSTransition
        in={showMenu}
        timeout={300}
        classNames="menu"
        unmountOnExit
      >
        <ul className="menu">
          <li>首页</li>
          <li>关于</li>
        </ul>
      </CSSTransition>
    </div>
  );
}

配套CSS:

react实现菜单切换

.menu-enter {
  opacity: 0;
  transform: translateY(-20px);
}
.menu-enter-active {
  opacity: 1;
  transform: translateY(0);
  transition: all 300ms;
}
.menu-exit {
  opacity: 1;
}
.menu-exit-active {
  opacity: 0;
  transform: translateY(-20px);
  transition: all 300ms;
}

多级嵌套菜单实现

通过递归组件或状态嵌套处理多级菜单。每个子菜单维护自身的展开状态,通过map动态渲染层级结构。

function SubMenu({ items }) {
  const [isOpen, setIsOpen] = useState(false);

  return (
    <li>
      <span onClick={() => setIsOpen(!isOpen)}>
        {items.title} {isOpen ? '▼' : '►'}
      </span>
      {isOpen && items.children && (
        <ul>
          {items.children.map((child, index) => (
            <SubMenu key={index} items={child} />
          ))}
        </ul>
      )}
    </li>
  );
}

function NestedMenu() {
  const menuData = [
    {
      title: '一级菜单',
      children: [
        { title: '二级菜单A' },
        { title: '二级菜单B', children: [{ title: '三级菜单' }] },
      ],
    },
  ];

  return (
    <ul>
      {menuData.map((item, index) => (
        <SubMenu key={index} items={item} />
      ))}
    </ul>
  );
}

与路由结合(React Router)

在菜单项中集成路由跳转功能,使用Link组件替代普通<a>标签,实现无刷新页面切换。

import { Link } from 'react-router-dom';

function NavMenu() {
  return (
    <ul>
      <li><Link to="/home">首页</Link></li>
      <li><Link to="/about">关于</Link></li>
    </ul>
  );
}

标签: 菜单react
分享给朋友:

相关文章

vue实现下拉菜单

vue实现下拉菜单

实现下拉菜单的基本结构 使用 Vue 的 v-show 或 v-if 控制下拉菜单的显示与隐藏。通过点击按钮或父元素触发下拉状态切换。 <template> <div c…

vue无限菜单怎么实现

vue无限菜单怎么实现

Vue 无限级菜单的实现 实现无限级菜单通常需要递归组件和动态数据结构的结合。以下是具体实现方法: 数据结构设计 采用嵌套结构表示菜单层级,每个菜单项包含 children 属性存储子菜单:…

react如何取消渲染

react如何取消渲染

取消渲染的方法 在React中,取消渲染通常指的是在某些条件下阻止组件渲染或中断正在进行的渲染过程。以下是几种常见的方法: 条件渲染 通过条件判断决定是否渲染组件或部分内容。可以使用if语句或三元…

如何降低react版本

如何降低react版本

降低 React 项目版本的步骤 检查当前 React 版本 运行以下命令查看项目中安装的 React 当前版本: npm list react 或 yarn list react 修…

如何优化react

如何优化react

优化 React 性能的方法 使用 React.memo 或 PureComponent 对于函数组件,使用 React.memo 进行记忆化,避免不必要的重新渲染。类组件可以使用 PureCompo…

react如何衰减

react如何衰减

React 中的动画衰减效果实现 在 React 中实现衰减效果(如滚动衰减、拖动释放后的惯性滑动)通常需要结合物理动画原理或第三方动画库。以下是几种常见方法: 使用 CSS 动画和 @keyf…