Files
asset-homepage/NAVBAR-REFACTOR.md

4.1 KiB
Raw Permalink Blame History

Navbar 重构说明

重构概述

成功将导航栏从原生 HTML + Tailwind 重构为使用 HeroUI 组件。

主要变化

1. 使用的 HeroUI 组件

组件 用途
Navbar 主导航容器
NavbarBrand Logo 区域
NavbarContent 内容分组(左中右)
NavbarItem 单个导航项
Button 按钮组件
Dropdown 下拉菜单
DropdownTrigger 下拉触发器
DropdownMenu 下拉菜单内容
DropdownItem 下拉菜单项

2. 代码对比

重构前(原生 HTML

<nav className="fixed top-0 left-0 right-0 z-50 px-10 py-5 flex items-center justify-between">
  <div className="flex-1">
    <Image src="/logo0.svg" alt="Logo" width={160} height={40} />
  </div>

  <div className="flex items-center gap-12">
    <div className="bg-transparent rounded-lg px-4 py-2 hover:bg-[#f3f4f6]">
      <span>Product</span>
    </div>
  </div>

  <div className="bg-[#111827] rounded-lg px-5 py-2.5">
    <span>Launch App</span>
  </div>
</nav>

重构后HeroUI

<HeroNavbar maxWidth="full" className="...">
  <NavbarBrand>
    <Image src="/logo0.svg" alt="Logo" width={160} height={40} />
  </NavbarBrand>

  <NavbarContent justify="center">
    <NavbarItem>
      <Button variant="light">Product</Button>
    </NavbarItem>
  </NavbarContent>

  <NavbarContent justify="end">
    <NavbarItem>
      <Button>Launch App</Button>
    </NavbarItem>
  </NavbarContent>
</HeroNavbar>

3. 优势

语义化更好

  • 使用专门的 Navbar 组件,代码意图更清晰
  • 自动处理响应式布局

代码更简洁

  • Button 组件内置 hover、active 等状态
  • Dropdown 组件自动处理打开/关闭逻辑

可访问性更好

  • HeroUI 组件内置 ARIA 属性
  • 键盘导航支持

一致性

  • 所有组件遵循统一的设计系统
  • 暗色模式自动适配

可维护性

  • 更少的自定义 className
  • 更少的样式代码

4. 保留的功能

主题切换(亮色/暗色) 语言切换(中文/英文) 产品菜单下拉 资源菜单下拉 滚动时背景变化 Logo 和按钮的入场动画 所有自定义样式和品牌色

5. 文件结构

components/
├── Navbar.tsx          # 新版本HeroUI
├── Navbar.old.tsx      # 旧版本(备份)
├── ProductMenu.tsx     # 产品菜单(保持不变)
└── ResourceMenu.tsx    # 资源菜单(保持不变)

使用的 HeroUI API

Navbar Props

<HeroNavbar
  maxWidth="full"              // 最大宽度
  className="..."              // 自定义样式
  classNames={{                // 内部元素样式
    wrapper: "px-10 py-2"
  }}
/>

Button Props

<Button
  variant="light"              // 变体light, solid, bordered, flat, ghost
  isIconOnly                   // 仅图标按钮
  onPress={() => {}}           // 点击事件
  className="..."              // 自定义样式
  startContent={<Icon />}      // 前置内容
  endContent={<Icon />}        // 后置内容
/>

Dropdown 用法

<Dropdown>
  <DropdownTrigger>
    <Button>选择语言</Button>
  </DropdownTrigger>
  <DropdownMenu
    onAction={(key) => {}}     // 选择事件
    selectedKeys={new Set()}   // 选中的项
  >
    <DropdownItem key="zh">中文</DropdownItem>
    <DropdownItem key="en">English</DropdownItem>
  </DropdownMenu>
</Dropdown>

下一步优化建议

  1. 已完成:基础导航栏重构
  2. 🔄 可选:将 ProductMenu 和 ResourceMenu 也改为 HeroUI 的 Popover 或 Modal
  3. 🔄 可选添加移动端菜单NavbarMenuToggle
  4. 🔄 可选:使用 HeroUI 的主题系统替代自定义 ThemeContext

测试清单

  • 检查亮色模式显示
  • 检查暗色模式显示
  • 测试主题切换
  • 测试语言切换
  • 测试产品菜单
  • 测试资源菜单
  • 测试响应式布局
  • 测试滚动效果
  • 测试入场动画

回滚方法

如果需要回滚到旧版本:

mv components/Navbar.tsx components/Navbar.heroui.tsx
mv components/Navbar.old.tsx components/Navbar.tsx