Error: Invalid hook call

51 阅读1分钟

场景: react请求拦截器里面在store中获取token,zustand的useUserStore报错 请求响应拦截器中,使用react router 的useNavigate报错

image.png

官方解释:zh-hans.react.dev/warnings/in…

原因: 排查1,版本问题,没有发现问题
排查2:ReactHook只能在函数组件或者自定义Hook内部调用,而响应拦截器不属于这种场景,所以报错

解决:

// 为了避免在非组件环境下调用 `useUserStore`,可以直接从 `useUserStore` 的实例里获取状态,而不是通过 Hook 来获取
const { useInfo } = useUserStore.getState();


// 定义一个导航函数类型
type NavigateFunction = (to: string) => void;
let navigateFn: NavigateFunction | null = null;
// 提供一个设置导航函数的方法
export function setNavigate(navigate: NavigateFunction) {
  navigateFn = navigate;
}

// 跳转401
navigateFn?.('/401')

在函数组件中设置

import { useNavigate } from '@tanstack/react-router';
import { setNavigate } from './utils/request';

const App = () => {
  const navigate = useNavigate();

  // 设置导航函数
  setNavigate((to) => navigate({ to }));

  return (
    // 组件内容
  );
};

export default App;

在函数组件中设置

import { useNavigate } from '@tanstack/react-router';
import { setNavigate } from './utils/request';

const Componnent = () => {
  const navigate = useNavigate();

  // 设置导航函数
  setNavigate((to) => navigate({ to }));

  return (
    // 组件内容
  );
};

export default Componnent;