# 📁 左侧菜单收起/展开功能说明
## ✨ 功能概述
左侧导航菜单现已支持**收起和展开**功能,用户可以通过点击按钮来切换菜单的显示模式,提供更灵活的界面布局体验。
---
## 🎯 功能特性
### ✅ **展开模式**(默认)
- 宽度:256px (w-64)
- 显示完整菜单文字
- 显示"功能菜单"标题
- 显示一级和二级菜单
- 支持菜单折叠/展开
### ✅ **收起模式**
- 宽度:64px (w-16)
- 仅显示首字母图标
- 鼠标悬停显示完整信息
- 点击直接导航到第一个子菜单
- 节省屏幕空间
---
## 🎨 界面展示
### **展开状态**
```
┌────────────────────────────┐ ◁◁
│ ▼ 农机档案管理 │ ↑
│ 档案录入 │ 收起按钮
│ 档案列表 │ (浮动在右侧)
│ 二维码管理 │
│ 档案分类 │
│ │
│ ▶ 农机作业监测 │
│ │
│ ▶ 驾驶员管理 │
└────────────────────────────┘
256px 宽度
```
### **收起状态**
```
┌──────┐ ▷▷
│ 📁 │ ↑
│ 👤 │ 展开按钮
│ 📊 │ (浮动在右侧)
│ 🖥️ │
└──────┘
64px
宽度
```
---
## 🖱️ 操作指南
### **方法1:点击按钮**
1. **展开 → 收起**
- 点击顶部的 `◁◁` 按钮
- 菜单收起为图标模式
2. **收起 → 展开**
- 点击顶部的 `▷▷` 按钮
- 菜单展开为完整模式
### **方法2:键盘快捷键**(可扩展)
目前暂不支持,未来可添加:
- `Ctrl + B` - 切换侧边栏
- `[` - 收起侧边栏
- `]` - 展开侧边栏
---
## 💡 交互细节
### **展开模式**
#### **一级菜单**
- 点击:折叠/展开二级菜单
- 显示:完整菜单名称
- 图标:`▼` 展开 / `▶` 折叠
#### **二级菜单**
- 点击:导航到对应页面
- 高亮:当前激活页面显示绿色背景
- 悬停:显示灰色背景
### **收起模式**
#### **菜单图标**
- 显示:菜单名称首字母(如"农")
- 样式:居中显示,较大字号
- 高亮:包含当前页面的菜单显示绿色背景
#### **悬停提示**
- 触发:鼠标悬停在菜单图标上
- 显示:完整菜单名称 + 所有子菜单列表
- 位置:右侧弹出
- 延迟:无延迟(即时显示)
#### **点击行为**
- 收起状态下点击一级菜单
- 自动导航到该菜单的第一个子功能
- 无需先展开再选择
---
## 🎨 视觉效果
### **动画效果**
- ✨ 宽度变化:300ms 平滑过渡
- ✨ 按钮图标:自动切换方向
- ✨ 内容淡入淡出:流畅切换
### **状态指示**
- 🟢 **当前页面**:绿色背景高亮
- ⚪ **普通菜单**:灰色文字
- 🔵 **悬停状态**:浅灰背景
- 🟢 **激活菜单组**:收起时显示绿色背景
---
## 🔧 技术实现
### **核心组件**
#### **Sidebar.tsx**
```typescript
interface SidebarProps {
menus: MenuItem[];
activePath: string;
onNavigate: (path: string) => void;
collapsed?: boolean; // 新增:收起状态
onCollapsedChange?: (collapsed: boolean) => void; // 新增:状态改变回调
}
```
#### **状态管理**
```typescript
// App.tsx
const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
```
### **样式控制**
#### **宽度切换**
```tsx
className={cn(
"bg-white border-r transition-all duration-300",
collapsed ? "w-16" : "w-64"
)}
```
#### **内容显示**
```tsx
{collapsed ? (
// 收起模式:显示首字母 + Tooltip
{menu.label.charAt(0)}
{menu.label}
) : (
// 展开模式:显示完整文字
{menu.label}
)}
```
### **使用的组件**
- `Button` - 切换按钮
- `Tooltip` - 悬停提示
- `ChevronsLeft` / `ChevronsRight` - 图标
- Tailwind CSS - 样式和动画
---
## 📊 使用场景
### **场景1:宽屏显示**
- 默认展开菜单
- 显示完整功能列表
- 方便快速浏览和选择
### **场景2:小屏幕**
- 收起菜单节省空间
- 内容区域更宽广
- 图表和表格显示更完整
### **场景3:专注工作**
- 收起菜单减少干扰
- 专注于当前任务
- 需要时悬停查看
### **场景4:演示展示**
- 收起菜单让界面更简洁
- 突出显示主要内容
- 提升视觉效果
---
## 💾 状态持久化(可扩展)
### **当前状态**
- ❌ 刷新页面后恢复默认(展开)
- ❌ 不记忆用户偏好
### **可扩展功能**
#### **LocalStorage存储**
```typescript
// 保存状态
const setSidebarCollapsed = (collapsed: boolean) => {
setCollapsed(collapsed);
localStorage.setItem('sidebarCollapsed', String(collapsed));
};
// 读取状态
useEffect(() => {
const saved = localStorage.getItem('sidebarCollapsed');
if (saved) {
setCollapsed(saved === 'true');
}
}, []);
```
#### **用户偏好设置**
- 在个人中心保存界面偏好
- 同步到用户配置
- 跨设备共享设置
---
## 🎯 最佳实践
### **何时使用收起模式**
✅ **适合收起**:
- 小屏幕或笔记本电脑
- 需要更多水平空间
- 查看宽表格或图表
- 演示或截图时
- 熟悉菜单位置后
❌ **不适合收起**:
- 首次使用系统
- 需要频繁切换功能
- 不熟悉菜单结构
- 培训或教学场景
### **交互建议**
1. **快速切换**
- 使用按钮一键切换
- 记住常用功能位置
2. **悬停查看**
- 收起状态下悬停查看详情
- 确认功能再点击
3. **键盘导航**
- Tab键切换焦点
- Enter键激活菜单
---
## 📱 响应式支持
### **桌面端**
- ✅ 支持展开/收起切换
- ✅ 默认展开显示
- ✅ Tooltip完整显示
### **平板端**
- ✅ 支持展开/收起
- ✅ 建议默认收起
- ✅ 触摸友好
### **移动端**(未来扩展)
- 🔄 抽屉式侧边栏
- 🔄 全屏覆盖模式
- 🔄 底部导航栏
---
## 🔮 未来增强
### **计划功能**
- [ ] **记忆用户偏好**
- LocalStorage持久化
- 用户配置同步
- [ ] **键盘快捷键**
- Ctrl+B 切换侧边栏
- 方向键导航菜单
- [ ] **拖拽调整宽度**
- 展开模式支持拖拽边缘
- 自定义侧边栏宽度
- [ ] **侧边栏位置**
- 支持左侧/右侧切换
- 用户自定义位置
- [ ] **迷你模式优化**
- 显示图标而非文字
- 为每个菜单配置图标
- [ ] **搜索功能**
- 快速搜索菜单项
- 模糊匹配
- [ ] **收藏夹**
- 收藏常用功能
- 快速访问入口
---
## ⚙️ 配置选项
### **默认状态**
修改 `App.tsx`:
```typescript
// 默认展开
const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
// 默认收起
const [sidebarCollapsed, setSidebarCollapsed] = useState(true);
```
### **禁用功能**
如需禁用收起功能,注释掉切换按钮:
```tsx
// 在 Sidebar.tsx 中注释这部分代码
{/*
*/}
```
---
## ❓ 常见问题
**Q: 收起后如何快速找到功能?**
A: 鼠标悬停在菜单图标上会显���完整的菜单信息。
**Q: 刷新页面后状态会保持吗?**
A: 当前不会,默认恢复为展开状态。可通过LocalStorage扩展此功能。
**Q: 收起状态下怎么查看二级菜单?**
A: 直接点击一级菜单会导航到第一个子功能,或悬停查看所有子菜单。
**Q: 可以调整侧边栏宽度吗?**
A: 当前不支持,固定为64px(收起)和256px(展开)。
**Q: 支持键盘操作吗?**
A: 目前仅支持Tab键切换焦点,未来会添加更多快捷键。
---
## 🎨 自定义样式
### **修改宽度**
```tsx
// Sidebar.tsx
className={cn(
"transition-all duration-300",
collapsed ? "w-16" : "w-64" // 修改这里的值
)}
```
### **修改动画速度**
```tsx
// 更快的动画
transition-all duration-150
// 更慢的动画
transition-all duration-500
// 无动画
transition-none
```
### **修改按钮样式**
```tsx