TanStackT
TanStack16mo ago
4 replies
spotty-amber

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 * 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>
  )
}
Was this page helpful?