v6升级实战:useNavigate跳转参数传递问题解决
最近在将项目从React Router v5升级到v6时,遇到了一个令人头疼的问题——使用useNavigate进行页面跳转时,参数传递出现了异常。这个看似简单的问题,在实际开发中却让我踩了不少坑。
问题复现
升级后,我将原来的<Redirect>组件替换为useNavigate,代码如下:
const navigate = useNavigate();
const handleClick = () => {
navigate('/detail', { state: { id: 123, name: 'test' } });
};
但在目标页面/detail中,通过useLocation()获取的state竟然为空对象!这让我一度怀疑人生。
根本原因
经过排查发现,问题出在项目中使用了react-router-dom的BrowserRouter包装。在v6中,useNavigate的参数传递机制有所改变,如果路由配置不当,会导致state丢失。
解决方案
方案一:确保路由配置正确
// router.js
<Routes>
<Route path="/" element={<Layout/>}>
<Route index element={<Home />} />
<Route path="detail" element={<Detail />} />
</Route>
</Routes>
方案二:使用对象形式传递参数
const navigate = useNavigate();
const handleClick = () => {
navigate('/detail?id=123&name=test'); // 使用查询字符串
};
方案三:封装导航函数
const useCustomNavigate = () => {
const navigate = useNavigate();
return (path, state) => {
navigate(path, { replace: true, state });
};
};
经验总结
v6的升级确实带来了更好的性能和更清晰的API,但参数传递问题需要特别注意。建议在升级前做好充分测试,避免线上出现意外情况。

讨论