T
TanStack12mo ago
stormy-gold

Loader doesn't get router context

I'm trying to use a TanStack Query queryClient in my loader that I pass through context, but the loader is not detecting the context. I'm wondering if I'm doing anything wrong.
import React from 'react'
import ReactDOM from 'react-dom/client'
import { RouterProvider, createRouter } from '@tanstack/react-router'
import { routeTree } from './routeTree.gen'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'

const queryClient = new QueryClient()

// Set up a Router instance
const router = createRouter({
routeTree,
context: {
queryClient: queryClient,
},
defaultPreload: 'intent',
defaultPreloadStaleTime: 0,
})

// Register things for typesafety
declare module '@tanstack/react-router' {
interface Register {
router: typeof router
}
}

const rootElement = document.getElementById('app')!

if (!rootElement.innerHTML) {
const root = ReactDOM.createRoot(rootElement)
root.render(
<QueryClientProvider client={queryClient}>
<RouterProvider router={router} />
</QueryClientProvider>
)
}
import React from 'react'
import ReactDOM from 'react-dom/client'
import { RouterProvider, createRouter } from '@tanstack/react-router'
import { routeTree } from './routeTree.gen'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'

const queryClient = new QueryClient()

// Set up a Router instance
const router = createRouter({
routeTree,
context: {
queryClient: queryClient,
},
defaultPreload: 'intent',
defaultPreloadStaleTime: 0,
})

// Register things for typesafety
declare module '@tanstack/react-router' {
interface Register {
router: typeof router
}
}

const rootElement = document.getElementById('app')!

if (!rootElement.innerHTML) {
const root = ReactDOM.createRoot(rootElement)
root.render(
<QueryClientProvider client={queryClient}>
<RouterProvider router={router} />
</QueryClientProvider>
)
}
import * as React from 'react'
import { Await, createFileRoute, defer } from '@tanstack/react-router'
import { queryOptions } from '@tanstack/react-query'

const aboutQueryOptions = queryOptions({
queryKey: ['about'],
queryFn: () =>
new Promise<string>((r) =>
setTimeout(() => {
r('foo')
}, 5000)
),
})

export const Route = createFileRoute('/about')({
loader: ({ context: { queryClient } }) => {
const ready = "I'm ready"
const slow = queryClient.ensureQueryData(aboutQueryOptions)
return {
readyData: ready,
}
},
component: AboutComponent,
})

function AboutComponent() {
const { readyData } = Route.useLoaderData()
return (
<div className='p-2' id='about'>
<h3>About</h3>
<p>{readyData}</p>
</div>
)
}
import * as React from 'react'
import { Await, createFileRoute, defer } from '@tanstack/react-router'
import { queryOptions } from '@tanstack/react-query'

const aboutQueryOptions = queryOptions({
queryKey: ['about'],
queryFn: () =>
new Promise<string>((r) =>
setTimeout(() => {
r('foo')
}, 5000)
),
})

export const Route = createFileRoute('/about')({
loader: ({ context: { queryClient } }) => {
const ready = "I'm ready"
const slow = queryClient.ensureQueryData(aboutQueryOptions)
return {
readyData: ready,
}
},
component: AboutComponent,
})

function AboutComponent() {
const { readyData } = Route.useLoaderData()
return (
<div className='p-2' id='about'>
<h3>About</h3>
<p>{readyData}</p>
</div>
)
}
4 Replies
stormy-gold
stormy-goldOP12mo ago
The context in the loader is not typesafe
fascinating-indigo
fascinating-indigo12mo ago
I believe you didn't add the QueryClient to the root route context in your __root.tsx https://tanstack.com/router/latest/docs/framework/react/guide/router-context#how-about-an-external-data-fetching-library
TanStack | High Quality Open-Source Software for Web Developers
Headless, type-safe, powerful utilities for complex workflows like Data Management, Data Visualization, Charts, Tables, and UI Components.
From An unknown user
From An unknown user
ratty-blush
ratty-blush12mo ago
yes you need to use createRootRouteWithContext
stormy-gold
stormy-goldOP12mo ago
Ah ok! Thanks Leonard and Manuel!

Did you find this page helpful?