
在 React Router v6 中, 是一个需渲染的组件,不能直接调用;应使用 useNavigate 钩子在提交成功后执行命令式导航,确保跳转逻辑可靠、符合 React 渲染生命周期。
在 react router v6 中,`
在使用 react-router-dom v6 开发表单提交功能时,一个常见误区是误将
但更推荐、更灵活且语义更清晰的做法是使用 useNavigate 钩子。它返回一个可调用的导航函数,支持在事件处理、异步回调(如 axios 请求成功后)等任意时机命令式地触发跳转,无需中断当前组件渲染流程。
✅ 正确做法:在组件顶层调用 const navigate = useNavigate(),然后在 handleSubmit 成功逻辑中调用 navigate('./Confirmation'):
import { useNavigate } from 'react-router-dom';
const Mainpage = () => {
const navigate = useNavigate(); // ✅ 获取导航函数
const [submitted, setSubmitted] = useState(false);
const handleSubmit = async (e) => {
e.preventDefault();
try {
// ... 表单提交逻辑(axios 调用)
console.log('Data sent to Airtable:', response.data);
// ✅ 提交成功后立即跳转(命令式导航)
navigate('./Confirmation'); // 支持相对路径或绝对路径(如 '/confirmation')
// 可选:也可带状态传递
// navigate('./Confirmation', { state: { success: true } });
} catch (error) {
console.error('Submission failed:', error);
}
};
return (
<div classname="main-container">
<form onsubmit="{handleSubmit}">
{/* 表单字段... */}
</form>
</div>
);
};
⚠️ 注意事项:
- useNavigate 必须在函数组件内部或自定义 Hook 中调用,不可在条件语句或异步回调外提前解构;
- 路径参数区分大小写,确保目标路由已正确定义在 Routes 中(例如
} />); - 若使用相对路径(如 './Confirmation'),需确保当前路由层级支持该解析;生产环境建议优先使用绝对路径(如 '/confirmation')提升可维护性;
- 不要混用
渲染与 useNavigate —— 同一场景下选择一种即可;命令式跳转更适合表单成功流,而 更适用于基于状态的“重定向守卫”(如登录校验)。
? 小结:useNavigate 是 React Router v6 中处理用户交互驱动跳转的首选方式。它简洁、可控、与 React 异步逻辑天然契合,避免了因错误使用











