# GuideBar 统一控制实现总结 ## ✅ 已完成的统一改造 所有页面和组件现在都使用 **`global store`** 统一管理 `GuideBar` 的显示与隐藏。 --- ## 📦 核心实现 ### 1. **Global Store** (`src/store/global.ts`) ```typescript interface GlobalState { showGuideBar: boolean; guideBarZIndex: 'low' | 'high'; } interface GlobalActions { setShowGuideBar: (show: boolean) => void; setGuideBarZIndex: (zIndex: 'low' | 'high') => void; toggleGuideBar: () => void; } // 使用方法 import { useGlobalState } from "@/store/global"; const { showGuideBar, setShowGuideBar } = useGlobalState(); ``` --- ## 🎯 已改造的组件 ### 1️⃣ **LocationConfirmDialog** - 定位确认弹窗 **文件:** `src/components/LocationConfirmDialog/index.tsx` **改造内容:** - 使用 `useEffect` 监听 `visible` 状态 - `visible = true` 时自动隐藏 GuideBar - `visible = false` 时自动显示 GuideBar ```typescript const { setShowGuideBar } = useGlobalState(); useEffect(() => { if (visible) { setShowGuideBar(false); // 弹窗显示时隐藏 } else { setShowGuideBar(true); // 弹窗关闭时显示 } }, [visible, setShowGuideBar]); ``` **使用场景:** - 用户首次打开应用时的定位确认 - 检测到位置变化时的切换提示 --- ### 2️⃣ **HomeNavbar** - 首页导航栏 **文件:** `src/components/HomeNavbar/index.tsx` **改造内容:** - 引入 `setShowGuideBar` 方法 - 在显示定位弹窗时调用隐藏 - 在确认/取消时调用显示 ```typescript const { setShowGuideBar } = useGlobalState(); const showLocationConfirmDialog = () => { setShowGuideBar(false); // ... }; const handleLocationDialogConfirm = () => { // ... setShowGuideBar(true); }; const handleLocationDialogCancel = () => { // ... setShowGuideBar(true); }; ``` **使用场景:** - 城市切换提示 - 定位权限请求 --- ### 3️⃣ **UserInfo** - 用户信息组件(✨ 重要改造) **文件:** `src/components/UserInfo/index.tsx` **改造内容:** - ❌ 移除 `FamilyContext` 依赖 - ✅ 改用 `useGlobalState` 统一管理 - 优化了所有选择器(性别、地区、NTRP、职业)的 GuideBar 控制逻辑 **之前(使用 Context):** ```typescript const { handleGrandchildTrigger } = useContext(FamilyContext); handleGrandchildTrigger(true); // 隐藏(逻辑反转) handleGrandchildTrigger(false); // 显示 ``` **现在(使用 Store):** ```typescript const { setShowGuideBar } = useGlobalState(); setShowGuideBar(false); // 隐藏(直观明了) setShowGuideBar(true); // 显示 ``` **具体改动:** 1. **打开编辑弹窗时隐藏 GuideBar** ```typescript const handle_open_edit_modal = (field: string) => { setShowGuideBar(false); // 之前: handleGrandchildTrigger(true) // ... }; ``` 2. **关闭编辑弹窗时显示 GuideBar** ```typescript const handle_edit_modal_cancel = () => { setShowGuideBar(true); // 之前: handleGrandchildTrigger(false) // ... }; ``` 3. **选择器状态联动** ```typescript useEffect(() => { const visibles = [ gender_picker_visible, location_picker_visible, ntrp_picker_visible, occupation_picker_visible, ]; const allPickersClosed = visibles.every((item) => !item); // 所有选择器都关闭时显示 GuideBar,否则隐藏 setShowGuideBar(allPickersClosed); }, [ gender_picker_visible, location_picker_visible, ntrp_picker_visible, occupation_picker_visible, ]); ``` **使用场景:** - "我的"页面编辑个人信息 - 性别选择器 - 地区选择器 - NTRP 等级选择器 - 职业选择器 - 昵称/简介编辑 --- ### 4️⃣ **MainPage** - 主页面容器 **文件:** `src/main_pages/index.tsx` **改造内容:** - 从 store 获取 `showGuideBar` 和 `setShowGuideBar` - 保留 `handleGrandchildTrigger` 以保持向后兼容(但已无实际使用) ```typescript const { showGuideBar, guideBarZIndex, setShowGuideBar, setGuideBarZIndex } = useGlobalState(); // 根据状态渲染 GuideBar { showGuideBar ? : null } ``` --- ## 🔄 工作流程 ### 示例:用户编辑个人信息 1. **用户点击"编辑"按钮** ``` handle_open_edit_modal() 调用 → setShowGuideBar(false) → GuideBar 隐藏 ``` 2. **用户打开性别选择器** ``` setGenderPickerVisible(true) → useEffect 检测到 visibles 变化 → setShowGuideBar(false) → GuideBar 保持隐藏 ``` 3. **用户关闭选择器** ``` setGenderPickerVisible(false) → useEffect 检测到所有选择器都关闭 → setShowGuideBar(true) → GuideBar 显示 ``` 4. **用户点击"取消"** ``` handle_edit_modal_cancel() 调用 → setShowGuideBar(true) → GuideBar 显示 ``` --- ## 📊 对比表 | 项目 | 之前(FamilyContext) | 现在(Global Store) | |------|---------------------|---------------------| | **状态管理** | Context API(跨层传递) | Zustand Store(全局统一) | | **调用方式** | `handleGrandchildTrigger(value)` | `setShowGuideBar(show)` | | **逻辑清晰度** | ❌ 反转逻辑(true=隐藏) | ✅ 直观逻辑(false=隐藏) | | **依赖关系** | ❌ 需要 Context Provider | ✅ 直接引入 hook | | **类型安全** | ⚠️ `any` 类型 | ✅ 完整 TypeScript 类型 | | **调试能力** | ❌ 难以追踪状态变化 | ✅ 集中日志,易于调试 | | **可维护性** | ⚠️ 分散在多处 | ✅ 统一管理 | | **性能** | ⚠️ Context 更新触发重渲染 | ✅ Zustand 精确订阅 | --- ## 🎨 优势 ### 1. **代码更简洁** ```typescript // 之前 const { handleGrandchildTrigger } = useContext(FamilyContext); handleGrandchildTrigger(true); // 反直觉 // 现在 const { setShowGuideBar } = useGlobalState(); setShowGuideBar(false); // 直观明了 ``` ### 2. **逻辑更清晰** - `setShowGuideBar(true)` → 显示 GuideBar - `setShowGuideBar(false)` → 隐藏 GuideBar - 不需要记忆反转逻辑 ### 3. **调试更方便** 所有状态变化都有日志: ``` [UserInfo] 打开编辑弹窗,隐藏 GuideBar [Store] setShowGuideBar called with: false [Store] showGuideBar updated to: false ``` ### 4. **类型安全** ```typescript // 完整的 TypeScript 类型定义 interface GlobalActions { setShowGuideBar: (show: boolean) => void; // ✅ 明确的参数类型 toggleGuideBar: () => void; } ``` ### 5. **易于扩展** 需要新功能时,只需在 store 中添加: ```typescript // 未来可以轻松添加更多控制方法 interface GlobalActions { setShowGuideBar: (show: boolean) => void; setGuideBarZIndex: (zIndex: 'low' | 'high') => void; toggleGuideBar: () => void; hideGuideBarTemporarily: (duration: number) => void; // 新功能 } ``` --- ## 📝 使用指南 ### 在任何组件中使用 ```typescript import { useGlobalState } from "@/store/global"; function YourComponent() { const { showGuideBar, setShowGuideBar, toggleGuideBar } = useGlobalState(); // 隐藏 GuideBar const hideGuideBar = () => setShowGuideBar(false); // 显示 GuideBar const showGuideBar = () => setShowGuideBar(true); // 切换显示/隐藏 const toggle = () => toggleGuideBar(); return ...; } ``` ### 自动控制(推荐) 使用 `useEffect` 监听状态变化: ```typescript useEffect(() => { if (modalVisible) { setShowGuideBar(false); } else { setShowGuideBar(true); } }, [modalVisible, setShowGuideBar]); ``` --- ## ✅ 测试清单 ### 定位弹窗测试 - [ ] 首次打开应用时,定位弹窗显示,GuideBar 隐藏 - [ ] 点击"切换到XX",弹窗关闭,GuideBar 显示 - [ ] 点击"继续浏览XX",弹窗关闭,GuideBar 显示 ### 用户信息编辑测试 - [ ] 点击"编辑"按钮,编辑弹窗显示,GuideBar 隐藏 - [ ] 打开性别选择器,GuideBar 保持隐藏 - [ ] 关闭性别选择器,GuideBar 显示 - [ ] 打开地区选择器,GuideBar 隐藏 - [ ] 关闭地区选择器,GuideBar 显示 - [ ] 打开 NTRP 选择器,GuideBar 隐藏 - [ ] 关闭 NTRP 选择器,GuideBar 显示 - [ ] 点击"取消",编辑弹窗关闭,GuideBar 显示 ### 多选择器联动测试 - [ ] 同时打开多个选择器时,GuideBar 保持隐藏 - [ ] 只有所有选择器都关闭时,GuideBar 才显示 --- ## 🔍 调试方法 ### 查看控制台日志 ``` [UserInfo] 打开编辑弹窗,隐藏 GuideBar [Store] setShowGuideBar called with: false [Store] showGuideBar updated to: false [UserInfo] 关闭编辑弹窗,显示 GuideBar [Store] setShowGuideBar called with: true [Store] showGuideBar updated to: true ``` ### React DevTools 1. 打开 React DevTools 2. 找到 `MainPage` 组件 3. 查看 `showGuideBar` 的实时值 4. 观察状态变化是否符合预期 --- ## 🎉 总结 ✅ **LocationConfirmDialog** - 使用 store 统一控制 ✅ **HomeNavbar** - 使用 store 统一控制 ✅ **UserInfo** - 已从 FamilyContext 迁移到 store ✅ **MainPage** - 使用 store 统一渲染 所有组件现在都通过 **`useGlobalState`** 统一管理 GuideBar,代码更简洁、逻辑更清晰、维护更容易!🚀