当前位置:首页 > React

react menu组件实现

2026-01-27 03:14:36React

React Menu 组件实现方法

基础实现(使用原生 HTML 和 CSS)

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

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

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

export default Menu;
/* Menu.css */
.menu-container {
  position: relative;
}

.menu-list {
  list-style: none;
  padding: 0;
  margin: 0;
  border: 1px solid #ddd;
  border-radius: 4px;
  background: white;
  position: absolute;
  top: 100%;
  left: 0;
  width: 200px;
}

.menu-list li {
  padding: 8px 12px;
  cursor: pointer;
}

.menu-list li:hover {
  background: #f0f0f0;
}

使用 Material-UI 实现

import React from 'react';
import { Menu, MenuItem, Button } from '@mui/material';

const MaterialMenu = () => {
  const [anchorEl, setAnchorEl] = React.useState(null);
  const open = Boolean(anchorEl);

  const handleClick = (event) => {
    setAnchorEl(event.currentTarget);
  };

  const handleClose = () => {
    setAnchorEl(null);
  };

  return (
    <div>
      <Button onClick={handleClick}>Open Menu</Button>
      <Menu
        anchorEl={anchorEl}
        open={open}
        onClose={handleClose}
      >
        <MenuItem onClick={handleClose}>Item 1</MenuItem>
        <MenuItem onClick={handleClose}>Item 2</MenuItem>
        <MenuItem onClick={handleClose}>Item 3</MenuItem>
      </Menu>
    </div>
  );
};

export default MaterialMenu;

使用 Ant Design 实现

import React from 'react';
import { Menu, Dropdown, Button } from 'antd';

const AntMenu = () => {
  const menu = (
    <Menu>
      <Menu.Item key="1">Item 1</Menu.Item>
      <Menu.Item key="2">Item 2</Menu.Item>
      <Menu.Item key="3">Item 3</Menu.Item>
    </Menu>
  );

  return (
    <Dropdown overlay={menu}>
      <Button>Open Menu</Button>
    </Dropdown>
  );
};

export default AntMenu;

可复用自定义 Menu 组件

import React, { useState } from 'react';
import PropTypes from 'prop-types';

const CustomMenu = ({ items }) => {
  const [isOpen, setIsOpen] = useState(false);

  return (
    <div className="custom-menu">
      <button onClick={() => setIsOpen(!isOpen)}>Toggle Menu</button>
      {isOpen && (
        <ul className="menu-items">
          {items.map((item, index) => (
            <li key={index} onClick={item.onClick}>
              {item.label}
            </li>
          ))}
        </ul>
      )}
    </div>
  );
};

CustomMenu.propTypes = {
  items: PropTypes.arrayOf(
    PropTypes.shape({
      label: PropTypes.string.isRequired,
      onClick: PropTypes.func,
    })
  ).isRequired,
};

export default CustomMenu;

响应式菜单实现

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

const ResponsiveMenu = () => {
  const [isOpen, setIsOpen] = useState(false);
  const [isMobile, setIsMobile] = useState(window.innerWidth < 768);

  useEffect(() => {
    const handleResize = () => {
      setIsMobile(window.innerWidth < 768);
    };
    window.addEventListener('resize', handleResize);
    return () => window.removeEventListener('resize', handleResize);
  }, []);

  return (
    <div>
      {isMobile ? (
        <button onClick={() => setIsOpen(!isOpen)}>Menu</button>
      ) : (
        <ul className="desktop-menu">
          <li>Item 1</li>
          <li>Item 2</li>
          <li>Item 3</li>
        </ul>
      )}
      {isMobile && isOpen && (
        <ul className="mobile-menu">
          <li>Item 1</li>
          <li>Item 2</li>
          <li>Item 3</li>
        </ul>
      )}
    </div>
  );
};

export default ResponsiveMenu;

动画效果增强

import React, { useState } from 'react';
import { CSSTransition } from 'react-transition-group';
import './AnimatedMenu.css';

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

export default AnimatedMenu;
/* AnimatedMenu.css */
.menu-enter {
  opacity: 0;
  transform: translateY(-10px);
}

.menu-enter-active {
  opacity: 1;
  transform: translateY(0);
  transition: opacity 300ms, transform 300ms;
}

.menu-exit {
  opacity: 1;
}

.menu-exit-active {
  opacity: 0;
  transform: translateY(-10px);
  transition: opacity 300ms, transform 300ms;
}

react menu组件实现

react menu组件实现

标签: 组件react
分享给朋友:

相关文章

vue如何实现目录组件

vue如何实现目录组件

Vue 目录组件实现方法 基于递归组件实现树形目录 递归组件适合处理嵌套层级不确定的目录结构。创建一个可自调用的组件,通过 v-for 遍历子节点并递归渲染自身。 <template>…

react如何使用

react如何使用

React 的基本使用 React 是一个用于构建用户界面的 JavaScript 库,以下是一些核心概念和使用方法。 安装 React 通过 create-react-app 快速搭建 Reac…

vue实现组件

vue实现组件

Vue 组件实现基础 Vue 组件是可复用的 Vue 实例,用于封装 UI 和逻辑。通过 .vue 文件或直接注册组件实现。 单文件组件 (SFC) 示例 <template>…

vue实现组件跟随

vue实现组件跟随

实现组件跟随的常见方法 使用CSS定位 通过CSS的position: fixed或position: absolute属性实现组件跟随。需要结合JavaScript计算目标元素的位置。 <…

vue实现折叠组件

vue实现折叠组件

Vue 折叠组件实现方法 基于 v-show 和事件触发 通过 v-show 控制内容的显示与隐藏,结合点击事件切换状态。 <template> <div>…

vue实现下拉框组件

vue实现下拉框组件

Vue 下拉框组件实现 基础实现 创建基础下拉框组件,使用v-model实现双向数据绑定: <template> <div class="dropdown"> &…