当前位置:首页 > React

react typescript实现菜单

2026-01-26 21:08:18React

使用 React 和 TypeScript 实现菜单

定义菜单项类型

使用 TypeScript 定义菜单项的数据结构,确保类型安全。

interface MenuItem {
  id: string;
  label: string;
  path?: string;
  children?: MenuItem[];
}

创建菜单组件

构建一个可复用的菜单组件,支持嵌套子菜单。

import React, { useState } from 'react';

interface MenuProps {
  items: MenuItem[];
}

const Menu: React.FC<MenuProps> = ({ items }) => {
  const [activeSubMenu, setActiveSubMenu] = useState<string | null>(null);

  const handleClick = (id: string) => {
    setActiveSubMenu(activeSubMenu === id ? null : id);
  };

  return (
    <ul className="menu">
      {items.map((item) => (
        <li key={item.id} className="menu-item">
          <div 
            className="menu-label" 
            onClick={() => item.children && handleClick(item.id)}
          >
            {item.path ? <a href={item.path}>{item.label}</a> : item.label}
            {item.children && <span className="arrow">▼</span>}
          </div>
          {item.children && activeSubMenu === item.id && (
            <Menu items={item.children} />
          )}
        </li>
      ))}
    </ul>
  );
};

添加基本样式

为菜单添加简单的 CSS 样式,使其更美观。

.menu {
  list-style: none;
  padding: 0;
}

.menu-item {
  margin: 5px 0;
}

.menu-label {
  display: flex;
  justify-content: space-between;
  padding: 8px;
  background: #f0f0f0;
  cursor: pointer;
}

.menu-label a {
  text-decoration: none;
  color: #333;
}

.arrow {
  margin-left: 10px;
}

使用菜单组件

在父组件中使用菜单组件,并传递菜单数据。

const App: React.FC = () => {
  const menuItems: MenuItem[] = [
    {
      id: '1',
      label: 'Home',
      path: '/home',
    },
    {
      id: '2',
      label: 'Products',
      children: [
        {
          id: '2-1',
          label: 'Laptops',
          path: '/products/laptops',
        },
        {
          id: '2-2',
          label: 'Phones',
          path: '/products/phones',
        },
      ],
    },
    {
      id: '3',
      label: 'Contact',
      path: '/contact',
    },
  ];

  return (
    <div className="app">
      <Menu items={menuItems} />
    </div>
  );
};

扩展功能

添加更多功能,如高亮当前选中菜单项或支持图标。

interface MenuItem {
  id: string;
  label: string;
  path?: string;
  icon?: React.ReactNode;
  children?: MenuItem[];
}

const Menu: React.FC<MenuProps> = ({ items }) => {
  const [activeSubMenu, setActiveSubMenu] = useState<string | null>(null);
  const [activeItem, setActiveItem] = useState<string | null>(null);

  const handleClick = (id: string) => {
    setActiveSubMenu(activeSubMenu === id ? null : id);
  };

  const handleSelect = (id: string) => {
    setActiveItem(id);
  };

  return (
    <ul className="menu">
      {items.map((item) => (
        <li 
          key={item.id} 
          className={`menu-item ${activeItem === item.id ? 'active' : ''}`}
        >
          <div 
            className="menu-label" 
            onClick={() => {
              if (item.children) {
                handleClick(item.id);
              } else {
                handleSelect(item.id);
              }
            }}
          >
            {item.icon && <span className="menu-icon">{item.icon}</span>}
            {item.path ? (
              <a href={item.path}>{item.label}</a>
            ) : (
              <span>{item.label}</span>
            )}
            {item.children && <span className="arrow">▼</span>}
          </div>
          {item.children && activeSubMenu === item.id && (
            <Menu items={item.children} />
          )}
        </li>
      ))}
    </ul>
  );
};

响应式设计

使用媒体查询使菜单在不同屏幕尺寸下表现良好。

@media (max-width: 768px) {
  .menu {
    width: 100%;
  }

  .menu-item {
    width: 100%;
  }
}

通过以上步骤,可以构建一个功能完善、类型安全的 React TypeScript 菜单组件。根据实际需求,可以进一步扩展功能或调整样式。

react typescript实现菜单

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

相关文章

react native 如何

react native 如何

安装 React Native 开发环境 确保系统已安装 Node.js(建议版本 16 或更高)。通过以下命令安装 React Native CLI 工具: npm install -g reac…

vue实现左右菜单联动实现

vue实现左右菜单联动实现

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

css二级菜单制作

css二级菜单制作

使用纯CSS实现二级菜单 通过嵌套HTML结构和CSS选择器实现二级菜单的显示与隐藏效果。以下是一个基础实现方案: HTML结构: <ul class="menu"> <…

css制作横向菜单

css制作横向菜单

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

css制作二级菜单

css制作二级菜单

使用纯CSS制作二级菜单 通过CSS的:hover伪类和子选择器实现二级菜单的显示与隐藏。以下是一个典型的结构和样式示例: HTML结构 <nav class="menu"> &l…

vue实现下拉菜单

vue实现下拉菜单

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