# P8→NS1/RNS1 缺失项 #1：三看板 Tab 切换的缓存策略

## 简要结论
- 状态：⚠️ 部分解决
- 风险等级：🔴 高
- 三看板 Tab 切换已实现，但采用页面跳转而非组件切换，切换回来时不保持筛选状态和滚动位置。

## 详细审查

### 审查范围
- `apps/miniprogram/miniprogram/app.json`（tabBar 配置）
- `apps/miniprogram/miniprogram/custom-tab-bar/index.ts`（自定义 TabBar）
- `apps/miniprogram/miniprogram/components/board-tab-bar/board-tab-bar.ts`（看板内 Tab 组件）
- `apps/miniprogram/miniprogram/pages/board-finance/board-finance.ts`（财务看板 Tab 切换）
- `apps/miniprogram/miniprogram/pages/board-coach/board-coach.ts`（助教看板 Tab 切换）
- `apps/miniprogram/miniprogram/pages/board-customer/board-customer.ts`（客户看板 Tab 切换）

### 发现

1. **Tab 切换方式：页面跳转，非组件内切换**
   - `app.json` 中 tabBar 仅注册了 `board-finance` 为 tabBar 页面
   - `board-customer` 和 `board-coach` 是普通页面（非 tabBar 页面）
   - 从 `board-finance` 切换到其他看板使用 `wx.navigateTo()`（页面栈压入）
   - 从 `board-coach`/`board-customer` 切换到 `board-finance` 使用 `wx.switchTab()`（清空页面栈）

2. **筛选状态不保持**
   - 每个看板页面的筛选状态（`selectedSort`、`selectedDimension`、`selectedTime` 等）存储在 Page data 中
   - 使用 `wx.navigateTo` 跳转时，离开的页面会被销毁（返回时重新 `onLoad`）
   - 使用 `wx.switchTab` 回到 `board-finance` 时，该页面会触发 `onShow` 但不会重新 `onLoad`（tabBar 页面有缓存）
   - 但 `board-coach` 和 `board-customer` 作为非 tabBar 页面，每次进入都会重新创建

3. **滚动位置不保持**
   - 三个看板页面均无滚动位置保存/恢复逻辑
   - 页面重新加载后滚动位置归零

4. **切换动画**
   - 未实现 P8 定义的切换动画
   - 使用微信默认的页面跳转动画（右滑进入/左滑返回）

### 证据

```typescript
// board-finance.ts — 切换到其他看板
onTabChange(e: WechatMiniprogram.TouchEvent) {
    const tab = e.currentTarget.dataset.tab as string
    if (tab === 'customer') {
      wx.navigateTo({ url: '/pages/board-customer/board-customer' })
    } else if (tab === 'coach') {
      wx.navigateTo({ url: '/pages/board-coach/board-coach' })
    }
}

// board-coach.ts — 切换回财务看板
onTabChange(e: WechatMiniprogram.TouchEvent) {
    const tab = e.currentTarget.dataset.tab as string
    if (tab === 'finance') {
      wx.switchTab({ url: '/pages/board-finance/board-finance' })
    } else if (tab === 'customer') {
      wx.navigateTo({ url: '/pages/board-customer/board-customer' })
    }
}
```

```json
// app.json — 仅 board-finance 是 tabBar 页面
"tabBar": {
    "custom": true,
    "list": [
      { "pagePath": "pages/task-list/task-list", "text": "任务" },
      { "pagePath": "pages/board-finance/board-finance", "text": "看板" },
      { "pagePath": "pages/my-profile/my-profile", "text": "我的" }
    ]
}
```

### 建议
1. **方案 A（推荐）**：将筛选状态持久化到 `getApp().globalData` 或 `wx.setStorageSync`，页面 `onLoad` 时恢复
2. **方案 B**：将三个看板合并为一个页面，使用 `wx:if` 或 `hidden` 切换内容区域，天然保持状态
3. 滚动位置可通过 `onPageScroll` 记录 + `onLoad` 时 `wx.pageScrollTo` 恢复
4. 切换动画可通过 CSS transition 在顶部 Tab 区域实现高亮滑动效果
