Skip to main content

React Query

Start by providing an OpenAPI specification and an Orval config file. To use React Query, define the mode in the Orval config to be react-query.

Example with React Query

module.exports = {
petstore: {
output: {
mode: 'tags-split',
target: 'src/petstore.ts',
schemas: 'src/model',
client: 'react-query',
mock: true,
},
input: {
target: './petstore.yaml',
},
},
};

Navigate to the Orval config reference to see all available options.

The React Query mode will generate an implementation file with one custom hook per path in the OpenAPI Specification.

For example, this Swagger specification will generate the following hooks:

export const showPetById = (
petId: string,
options?: AxiosRequestConfig,
): Promise<AxiosResponse<Pet>> => {
return axios.get(`/pets/${petId}`, options);
};
export const getShowPetByIdQueryKey = (petId: string) => [`/pets/${petId}`];
export const useShowPetById = <
TData = AsyncReturnType<typeof showPetById>,
TError = Error,
>(
petId: string,
options?: {
query?: UseQueryOptions<AsyncReturnType<typeof showPetById>, TError, TData>;
axios?: AxiosRequestConfig;
},
) => {
const { query: queryOptions, axios: axiosOptions } = options ?? {};
const queryKey = queryOptions?.queryKey ?? getShowPetByIdQueryKey(petId);
const queryFn = () => showPetById(petId, axiosOptions);
const query = useQuery<AsyncReturnType<typeof queryFn>, TError, TData>(
queryKey,
queryFn,
{ enabled: !!petId, ...queryOptions },
);
return {
queryKey,
...query,
};
};

How to Use Other Queries

Given the following configuration, Orval will generate useQuery and useInfiniteQuery hooks with a nextId query parameter. It is also possible to override the config for every hook with the options field.

module.exports = {
petstore: {
output: {
...
override: {
query: {
useQuery: true,
useInfinite: true,
useInfiniteQueryParam: 'nextId',
options: {
staleTime: 10000,
},
},
},
},
...
},
};

If needed, it is also possible to override the query options for a single operation or tag:

module.exports = {
petstore: {
output: {
...
override: {
operations: {
listPets: {
query: {
...
},
}
},
},
}
...
},
};

Go here for a full example

Was this page helpful?