rembrembdocs

info

Add tRPC to existing React project

Server Side

1. Install dependencies

bash

yarn add @trpc/server zod

2. Enable strict mode

If you want to use Zod for input validation, make sure you have enabled strict mode in your tsconfig.json:

json

// tsconfig.json

{

// ...

"compilerOptions": {

`// ...`

`"strict": true`

}

}

If strict mode is too much, at least enable strictNullChecks:

json

// tsconfig.json

{

// ...

"compilerOptions": {

`// ...`

`"strictNullChecks": true`

}

}

3. Implement your appRouter

Follow the Quickstart and read the @trpc/server docs for guidance on this. Once you have your API implemented and listening via HTTP, continue to the next step.

Client Side

tRPC works fine with Create React App!

1. Install dependencies

bash

yarn add @trpc/client @trpc/server @trpc/react react-query@3

2. Create tRPC hooks

Create a set of strongly-typed React hooks from your AppRouter type signature with createReactQueryHooks.

utils/trpc.ts

tsx

// utils/trpc.ts

import { createReactQueryHooks } from '@trpc/react';

import type { AppRouter } from '../path/to/router.ts';

export const trpc = createReactQueryHooks<AppRouter>();

// => { useQuery: ..., useMutation: ...}

3. Add tRPC providers

In your App.tsx

App.tsx

tsx

import React, { useState } from 'react';

import { QueryClient, QueryClientProvider } from 'react-query';

import { trpc } from './utils/trpc';

export function App() {

const [queryClient] = useState(() => new QueryClient());

const [trpcClient] = useState(() =>

`trpc.createClient({`

  `url: 'http://localhost:5000/trpc',`

  `// optional`

  `headers() {`

    `return {`

      `authorization: getAuthCookie(),`

    `};`

  `},`

`}),`

);

return (

`<trpc.Provider client={trpcClient} queryClient={queryClient}>`

  `<QueryClientProvider client={queryClient}>`

    `{/* Your app here */}`

  `</QueryClientProvider>`

`</trpc.Provider>`

);

}

4. Fetch data

pages/IndexPage.tsx

tsx

import { trpc } from '../utils/trpc';

export default function IndexPage() {

const hello = trpc.useQuery(['hello', { text: 'client' }]);

if (!hello.data) return <div>Loading...</div>;

return (

`<div>`

  `<p>{hello.data.greeting}</p>`

`</div>`

);

}