当前位置:首页 > 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>
  );
};

响应式设计

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

react typescript实现菜单

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

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

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

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

相关文章

react 如何引入css

react 如何引入css

在 React 中引入 CSS 的方法 React 提供了多种引入 CSS 的方式,可以根据项目需求选择合适的方法。以下是常见的几种方式: 内联样式 内联样式直接在组件中通过 style 属性定义,…

vue实现左右菜单联动实现

vue实现左右菜单联动实现

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

css div 制作导航菜单

css div 制作导航菜单

基本导航菜单结构 使用HTML创建一个简单的导航菜单结构,通常使用<ul>和li>列表实现。每个菜单项用<a>标签包裹以实现链接功能。 <div class="n…

如何手写一个react

如何手写一个react

手写一个简单的 React 创建一个基础的 React 实现需要理解其核心概念:虚拟 DOM、组件、状态管理和渲染。以下是一个简化版的 React 实现。 创建虚拟 DOM 虚拟 DOM 是真实 D…

react如何查

react如何查

React 查询方法 React 提供了多种查询 DOM 元素的方式,以下是几种常见的方法: 使用 ref 通过 useRef 钩子可以获取 DOM 节点的引用,适用于直接操作 DOM 的场景。…

如何创建react

如何创建react

创建React项目的步骤 使用Create React App工具快速搭建React项目。确保已安装Node.js(版本需≥14.0.0)和npm(版本需≥5.6)。 打开终端或命令行工具,运行以下…