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

Vite-React项目中Tanstack Query V5调用invalidateQueries报错TypeError

问题:Tanstack Query V5调用invalidateQueries时报TypeError: Cannot read from private field

在Vite-React项目中使用Tanstack Query V5,执行发票删除mutation后,调用invalidateQueries刷新发票列表时抛出以下错误:

TypeError: Cannot read from private field
    at __accessCheck (chunk-TIUEEL27.js?v=ae984db9:41:11)
    at __privateGet (chunk-TIUEEL27.js?v=ae984db9:44:3)
    at chunk-PF574KJM.js?v=ae984db9:1620:7
    at Object.batch (chunk-PF574KJM.js?v=ae984db9:499:16)
    at invalidateQueries (chunk-PF574KJM.js?v=ae984db9:1619:26)
    at onClick (index.tsx:81:15)
    at HTMLUnknownElement.callCallback2 (chunk-EL3PUDHE.js?v=ae984db9:3674:22)
    at Object.invokeGuardedCallbackDev (chunk-EL3PUDHE.js?v=ae984db9:3699:24)
    at invokeGuardedCallback (chunk-EL3PUDHE.js?v=ae984db9:3733:39)
    at invokeGuardedCallbackAndCatchFirstError (chunk-EL3PUDHE.js?v=ae984db9:3736:33)

已将@tanstack/react-query版本从5.14.2升级至^5.26.3,问题仍未解决。


相关代码

main.tsx

import React from 'react'
import ReactDOM from 'react-dom/client'
import { BrowserRouter as Router } from 'react-router-dom'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
const queryClient = new QueryClient()
import App from './App.tsx'
import { DashboardProvider } from './context/Dashboard.context'
import { Toaster } from '@/components/ui/toaster'
import './index.css'

ReactDOM.createRoot(document.getElementById('root')!).render(
  <React.StrictMode>
    <Router>
      <QueryClientProvider client={queryClient}>
        <DashboardProvider>
          <App />
          <Toaster />
        </DashboardProvider>
        <ReactQueryDevtools initialIsOpen={false} />
      </QueryClientProvider>
    </Router>
  </React.StrictMode>
)

发票列表useQuery代码

const { isFetching, data } = useQuery({
  queryKey: ['invoiceList', page, limit],
  queryFn: async () => {
    const { data } = await apiRequest.get('/client/invoiceList', {
      params: { page, limit },
    })
    return data
  },
})

删除发票useMutation代码

const { invalidateQueries } = useQueryClient()
const { mutate, isPending } = useMutation({
  mutationFn: async () => {
    return await apiRequest.delete('/client/deleteInvoice', {
      params: { id: invoice?.id },
    })
  },
  onSuccess: () => {
    toast({
      variant: 'success',
      title: 'Invoice deleted successfully',
      description: `Invoice ${invoice?.reference} has been deleted successfully`,
    })
    invalidateQueries({ queryKey: ['invoiceList'] })
  },
  onError: (error) => {
    console.log(error?.message)
    handleError(error, toast)
  },
})

解决方案尝试

1. 统一Tanstack Query相关包版本

升级主包后,@tanstack/react-query-devtools版本可能未同步,导致内部私有字段访问冲突。执行以下命令统一版本:

npm install @tanstack/react-query@^5.26.3 @tanstack/react-query-devtools@^5.26.3

2. 替换invalidateQueries为refetchQueries

尝试用refetchQueries替代invalidateQueries,规避私有字段访问问题:

// 替换原invalidateQueries代码
queryClient.refetchQueries({ queryKey: ['invoiceList'] })

3. 临时移除React StrictMode测试

React StrictMode的双重渲染可能导致Tanstack Query内部私有状态异常。暂时注释掉<React.StrictMode>标签,重新运行项目验证错误是否消失:

ReactDOM.createRoot(document.getElementById('root')!).render(
    <Router>
      <QueryClientProvider client={queryClient}>
        <DashboardProvider>
          <App />
          <Toaster />
        </DashboardProvider>
        <ReactQueryDevtools initialIsOpen={false} />
      </QueryClientProvider>
    </Router>
)

4. 检查是否存在多个QueryClient实例

确认项目中没有在其他组件内重新创建QueryClient实例,所有组件都通过QueryClientProvider共享同一个全局实例。

5. 显式声明queryKey匹配规则

在invalidateQueries中添加exact: false(默认值,但显式声明确保匹配逻辑正确):

invalidateQueries({ queryKey: ['invoiceList'], exact: false })

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:55:18