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

Expo + tRPC网页端报错:未设置QueryClient,iOS模拟器正常

问题:Expo + tRPC应用网页端useQuery报错"No QueryClient set",iOS端正常

搭建Expo + tRPC技术栈应用时,类型检查功能正常,iOS模拟器可正常运行,但网页端调用useQuery时出现错误。


相关代码

app.tsx

export default function App() {
  return (
    <AuthenticationProvider>
      <TRPCProvider>
        <ThemeProvider theme={theme}>
          <NavigationContainer>
            <Stack.Navigator>
              <Stack.Screen name="Criteria" component={MovieSearchComponent}/>
              <Stack.Screen name="Results" component={ResultsComponent}/>
            </Stack.Navigator>
          </NavigationContainer>
        </ThemeProvider>
      </TRPCProvider>
    </AuthenticationProvider>
  );
}

ResultsComponent组件代码

import { trpc } from "../../utils/trpc-client";

export function ResultsComponent({navigation, route}) {
  const {data} = trpc.moviesRecommendation.useQuery({
    runtimeMinsMin: 100
  })
}

trpc-client.ts

import { AppRouter } from "../server/trpc";
import { createTRPCReact, httpLink } from "@trpc/react-query";

export const trpc = createTRPCReact<AppRouter>()

export const trpcClient = trpc.createClient({
  links: [httpLink({url: 'http://localhost:3000/api/trpc'})],
})

trpc-provider.tsx

export function TRPCProvider({children}: PropsWithChildren) {
  const [queryClient] = useState(() => new QueryClient())

  return (
    <trpc.Provider client={trpcClient} queryClient={queryClient}>
      <QueryClientProvider client={queryClient} contextSharing={true}>
        {children}
      </QueryClientProvider>
    </trpc.Provider>
  )
}

网页端错误信息

Uncaught Error: No QueryClient set, use QueryClientProvider to set one
    at Object.useQueryClient (QueryClientProvider.tsx:48:1)
    at Object.useBaseQuery (useBaseQuery.ts:33:1)
    at useQuery (useQuery.ts:139:1)
    at Object.useQuery$1 [as useQuery] (createHooksInternal-808efaa7.mjs:277:1)
    at createHooksInternal-808efaa7.mjs:52:1
    at Object.apply (index-972002da.mjs:18:1)
    at ResultsComponent (results-component.tsx:11:1)
    at renderWithHooks (react-dom.development.js:16175:1)
    at mountIndeterminateComponent (react-dom.development.js:20913:1)
    at beginWork (react-dom.development.js:22416:1)

修复方案

问题根源在于TRPCProvider的组件嵌套顺序错误:当前是tRPC Provider包裹QueryClientProvider,但tRPC的React Query集成要求**QueryClientProvider必须在tRPC Provider外层**。iOS端因Expo环境特性兼容了错误嵌套,网页端React DOM则严格遵循上下文传递规则,导致tRPC hooks无法获取QueryClient。

修改trpc-provider.tsx的嵌套顺序:

import { useState } from 'react';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { trpc, trpcClient } from './trpc-client';
import { PropsWithChildren } from 'react';

export function TRPCProvider({children}: PropsWithChildren) {
  const [queryClient] = useState(() => new QueryClient())

  return (
    <QueryClientProvider client={queryClient} contextSharing={true}>
      <trpc.Provider client={trpcClient} queryClient={queryClient}>
        {children}
      </trpc.Provider>
    </QueryClientProvider>
  )
}

额外检查项

  • 确保所有使用tRPC hooks的组件都被TRPCProvider包裹(你的app.tsx已满足此要求)
  • 确认@tanstack/react-query与@trpc/react-query版本匹配,避免版本冲突引发上下文问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:35:18