最近在将项目从React Router v5升级到v6时,遇到了一个令人头疼的路由跳转回退问题。在升级后,用户通过useNavigate进行页面跳转时,历史记录栈出现了异常行为。
问题复现步骤:
- 在v5中使用
<Redirect>组件实现重定向 - 升级到v6后,改为使用
navigate('/path')函数 - 发现用户在多个页面间跳转后,点击浏览器回退按钮时,无法正确返回到上一个页面
- 检查发现history栈中存在重复或缺失的记录项
关键代码问题:
// v6中的错误用法
const navigate = useNavigate();
const handleClick = () => {
navigate('/target'); // 这里没有正确处理历史栈
}
// 正确做法应该是
const navigate = useNavigate();
const handleClick = () => {
navigate('/target', { replace: false });
}
解决方案: 通过查阅文档,发现v6中useNavigate的参数选项有了变化。关键是要正确使用replace和state参数,同时在需要的地方手动管理history栈。此外,对于复杂的路由场景,建议封装一个通用的导航函数来统一处理历史记录。
这个升级过程确实踩了不少坑,特别是对历史栈的管理方式变更,需要仔细测试每一种导航场景。

讨论