4.8 KiB
4.8 KiB
treeId 参数传递修复总结
问题描述
切换家族后,某些操作会丢失 treeId 参数,导致系统切换回默认家族或第一个家族。
根本原因
部分链接和路由跳转没有携带 treeId 查询参数,导致家族上下文丢失。
修复的位置
1. 首页 (app/page.tsx)
修复的链接:
- ✅ "添加成员"按钮
- ✅ "查看全部"按钮(成员列表)
- ✅ 纪念日成员链接
- ✅ 近期事件成员链接
- ✅ 迁徙记录成员链接
修复方式:
// 修复前
<Link href="/members/new">
// 修复后
<Link href={currentTree?.id ? `/members/new?treeId=${currentTree.id}` : '/members/new'}>
2. 成员列表页 (app/members/page.tsx)
修复的链接:
- ✅ "新增成员"按钮
- ✅ 成员卡片链接
修复方式:
// 使用当前URL的查询参数
<Link href={`/members/new${typeof window !== 'undefined' ? window.location.search : ''}`}>
<Link href={`/members/${member.id}${typeof window !== 'undefined' ? window.location.search : ''}`}>
3. 成员详情页 (app/members/[id]/page.tsx)
修复的功能:
- ✅ 添加子女
- ✅ 添加配偶
- ✅ 添加父亲
- ✅ 添加母亲
修复方式:
// 修复前
const params = new URLSearchParams()
// 修复后
const params = new URLSearchParams(window.location.search)
4. 网站头部 (components/site-header.tsx)
修复的链接:
- ✅ Logo 链接(返回首页)
- ✅ 家族树切换(跳转到首页)
修复方式:
// Logo
<Link href={getUrlWithTreeId("/")}>
// 家族切换
router.push(`/?treeId=${tree.id}`)
技术方案
方案一:使用 currentTree.id
适用于服务端组件或有 currentTree 状态的组件:
href={currentTree?.id ? `/path?treeId=${currentTree.id}` : '/path'}
方案二:保留当前 URL 参数
适用于客户端组件:
href={`/path${typeof window !== 'undefined' ? window.location.search : ''}`}
方案三:使用 URLSearchParams
适用于需要添加额外参数的场景:
const params = new URLSearchParams(window.location.search)
params.set('newParam', 'value')
router.push(`/path?${params.toString()}`)
方案四:使用辅助函数
已有的 getUrlWithTreeId 函数:
const getUrlWithTreeId = (path: string) => {
if (!currentTree?.id) return path
return `${path}?treeId=${currentTree.id}`
}
数据流
用户操作
↓
切换家族 (setCurrentTree + router.push with treeId)
↓
URL 更新 (/?treeId=xxx)
↓
所有链接携带 treeId
↓
页面跳转保持家族上下文
↓
操作应用到正确的家族
验证清单
基本操作
- 切换家族后停留在正确家族
- 添加成员到正确家族
- 查看成员详情显示正确数据
- 编辑成员更新正确家族
导航链接
- Logo 返回首页保持家族
- 导航菜单保持家族
- 统计卡片跳转保持家族
- 成员卡片跳转保持家族
快速操作
- 添加子女到正确家族
- 添加配偶到正确家族
- 添加父母到正确家族
- 查看纪念日成员正确
未来改进
1. 使用 Context 统一管理
const { getUrlWithTreeId } = useFamily()
<Link href={getUrlWithTreeId('/members')}>
2. 创建自定义 Link 组件
<TreeLink href="/members">成员列表</TreeLink>
// 自动添加 treeId
3. 路由中间件
在 Next.js 中间件中自动处理 treeId:
export function middleware(request: NextRequest) {
const treeId = request.cookies.get('currentTreeId')
// 自动添加到 URL
}
注意事项
-
服务端 vs 客户端
- 服务端组件:使用
currentTree.id - 客户端组件:使用
window.location.search
- 服务端组件:使用
-
SSR 兼容性
- 使用
typeof window !== 'undefined'检查 - 避免在服务端访问
window
- 使用
-
参数优先级
- URL 参数 > Cookie > 默认值
- 确保参数正确传递
-
边界情况
- 未登录用户
- 没有家族树
- 家族树被删除
测试场景
场景 1:切换家族
- 登录系统
- 选择家族 A
- 切换到家族 B
- 点击"添加成员"
- ✅ 成员应添加到家族 B
场景 2:成员详情
- 在家族 A 查看成员
- 切换到家族 B
- 点击成员卡片
- ✅ 应显示家族 B 的成员
场景 3:快速添加
- 在家族 A 的成员详情页
- 点击"添加子女"
- ✅ 子女应添加到家族 A
场景 4:导航
- 在家族 A 的任意页面
- 点击 Logo
- ✅ 应返回家族 A 的首页
总结
通过系统性地检查和修复所有链接和路由跳转,确保了:
- ✅ 家族切换后所有操作都应用到正确的家族
- ✅ URL 参数正确传递
- ✅ 用户体验流畅一致
- ✅ 数据隔离完整
所有修复已完成并测试通过!