174 lines
4.1 KiB
Markdown
174 lines
4.1 KiB
Markdown
|
|
# Navbar 重构说明
|
|||
|
|
|
|||
|
|
## 重构概述
|
|||
|
|
|
|||
|
|
成功将导航栏从原生 HTML + Tailwind 重构为使用 HeroUI 组件。
|
|||
|
|
|
|||
|
|
## 主要变化
|
|||
|
|
|
|||
|
|
### 1. 使用的 HeroUI 组件
|
|||
|
|
|
|||
|
|
| 组件 | 用途 |
|
|||
|
|
|------|------|
|
|||
|
|
| `Navbar` | 主导航容器 |
|
|||
|
|
| `NavbarBrand` | Logo 区域 |
|
|||
|
|
| `NavbarContent` | 内容分组(左中右) |
|
|||
|
|
| `NavbarItem` | 单个导航项 |
|
|||
|
|
| `Button` | 按钮组件 |
|
|||
|
|
| `Dropdown` | 下拉菜单 |
|
|||
|
|
| `DropdownTrigger` | 下拉触发器 |
|
|||
|
|
| `DropdownMenu` | 下拉菜单内容 |
|
|||
|
|
| `DropdownItem` | 下拉菜单项 |
|
|||
|
|
|
|||
|
|
### 2. 代码对比
|
|||
|
|
|
|||
|
|
#### 重构前(原生 HTML)
|
|||
|
|
```tsx
|
|||
|
|
<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)
|
|||
|
|
```tsx
|
|||
|
|
<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
|
|||
|
|
```tsx
|
|||
|
|
<HeroNavbar
|
|||
|
|
maxWidth="full" // 最大宽度
|
|||
|
|
className="..." // 自定义样式
|
|||
|
|
classNames={{ // 内部元素样式
|
|||
|
|
wrapper: "px-10 py-2"
|
|||
|
|
}}
|
|||
|
|
/>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Button Props
|
|||
|
|
```tsx
|
|||
|
|
<Button
|
|||
|
|
variant="light" // 变体:light, solid, bordered, flat, ghost
|
|||
|
|
isIconOnly // 仅图标按钮
|
|||
|
|
onPress={() => {}} // 点击事件
|
|||
|
|
className="..." // 自定义样式
|
|||
|
|
startContent={<Icon />} // 前置内容
|
|||
|
|
endContent={<Icon />} // 后置内容
|
|||
|
|
/>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Dropdown 用法
|
|||
|
|
```tsx
|
|||
|
|
<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
|
|||
|
|
|
|||
|
|
## 测试清单
|
|||
|
|
|
|||
|
|
- [ ] 检查亮色模式显示
|
|||
|
|
- [ ] 检查暗色模式显示
|
|||
|
|
- [ ] 测试主题切换
|
|||
|
|
- [ ] 测试语言切换
|
|||
|
|
- [ ] 测试产品菜单
|
|||
|
|
- [ ] 测试资源菜单
|
|||
|
|
- [ ] 测试响应式布局
|
|||
|
|
- [ ] 测试滚动效果
|
|||
|
|
- [ ] 测试入场动画
|
|||
|
|
|
|||
|
|
## 回滚方法
|
|||
|
|
|
|||
|
|
如果需要回滚到旧版本:
|
|||
|
|
```bash
|
|||
|
|
mv components/Navbar.tsx components/Navbar.heroui.tsx
|
|||
|
|
mv components/Navbar.old.tsx components/Navbar.tsx
|
|||
|
|
```
|