You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Router+React Query:App组件自定义hook触发未设置QueryClient错误求助

问题原因

你遇到的错误是因为React-Query的自定义hook必须在QueryClientProvider的上下文范围内调用。当前你的useSoftware()是在App组件的顶层执行的,而QueryClientProvider是在App的return里才渲染的——这意味着调用hook的时候,Provider还没生效,自然获取不到QueryClient实例。

解决方案

方案1:将hook调用移到Provider内部的组件中

把useSoftware()的调用从App组件移到被QueryClientProvider包裹的子组件里,比如AppLayout或者页面组件:

修改后的App.jsx:

function App() {
  // 移除这里的useSoftware调用
  return (
    <QueryClientProvider client={queryClient}>
      <ReactQueryDevtools initialIsOpen={false} />
      <BrowserRouter>
        <GlobalStyles />
        <Routes>
          <Route element={<AppLayout />}>
            <Route index element={<MainPage replace to="home" />} />
        </Routes>
      </BrowserRouter>
    </QueryClientProvider>
  );
}

export default App;

在AppLayout中使用hook:

import { useSoftware } from './path-to-your-hook';
import { Outlet } from 'react-router-dom';

function AppLayout() {
  const { isLoading, software } = useSoftware();

  // 处理加载状态
  if (isLoading) {
    return <div>加载中...</div>;
  }

  return (
    <div className="app-layout">
      {/* 在这里使用software数据渲染导航、侧边栏等布局内容 */}
      <Outlet />
    </div>
  );
}

export default AppLayout;

方案2:将QueryClientProvider提升到App组件外层

如果必须在App组件中使用useSoftware(),可以把QueryClientProvider移到入口文件(比如index.js)中,让它包裹整个App组件:

修改index.js:

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';

// 初始化QueryClient
const queryClient = new QueryClient();

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <QueryClientProvider client={queryClient}>
    <App />
    <ReactQueryDevtools initialIsOpen={false} />
  </QueryClientProvider>
);

此时App.jsx就可以正常调用hook了:

function App() {
  const { isLoading, software } = useSoftware();

  if (isLoading) {
    return <div>加载中...</div>;
  }

  return (
    <BrowserRouter>
      <GlobalStyles />
      <Routes>
        <Route element={<AppLayout />}>
          <Route index element={<MainPage replace to="home" />} />
        </Routes>
      </BrowserRouter>
    </div>
  );
}

export default App;

内容的提问来源于stack exchange,提问作者Chicot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:42:34