React Router v6中为什么不能直接在事件处理函数内调用useNavigate?
你写的两种写法的核心差异本质是违反了React的基础规则和useNavigate的API设计要求,具体原因如下:
- 首先违反了React Hook的强制调用规则
所有React Hook(包括React Router提供的useNavigate)都要求只能在React组件的顶层渲染作用域调用,不能放到事件回调、条件判断、循环、嵌套函数里面调用。事件回调是组件渲染完成之后用户触发操作才会执行的逻辑,不属于组件顶层的渲染上下文,在这里调用Hook会直接触发React的规则报错,根本跑不起来。 - 其次
useNavigate本身的设计就不是直接传路径跳转的useNavigate()调用的时候只会返回一个绑定了当前路由上下文的导航函数,它自己不会直接执行跳转,也不接收路径作为入参。你必须先在组件顶层调用它拿到这个导航函数,之后在需要跳转的时候调用这个函数、传入你要跳转的路径才能生效。
你写的第二种写法同时踩了这两个坑,所以肯定跑不通。
符合规范的正确写法:
import { useNavigate } from 'react-router-dom'; // 组件顶层调用Hook,获取导航函数 const navigate = useNavigate(); const handleAskQuestionClick = () => { // 事件触发时调用导航函数,传入目标路径 navigate('ask'); };
错误写法的问题:
const handleAskQuestionClick = () => { // 1. 事件回调内调用Hook违反调用规则 // 2. useNavigate本身不接收路径参数,设计上就不支持直接这么调用 useNavigate('ask'); };
内容的提问来源于stack exchange,提问作者JB Cooper
相关产品推荐
相关产品推荐

