React Query
Introduction
Fresh & Stale State
Default Behavior
Query Cancellation
Setup Provider
UseQuery
UseMutation
Last updated
Last updated
import axios from 'axios'
const query = useQuery('todos', ({ signal }) =>
axios.get('/todos', {
// Pass the signal to `axios`
signal,
})
)import axios from 'axios'
const query = useQuery('todos', () => {
// Create a new CancelToken source for this request
const CancelToken = axios.CancelToken
const source = CancelToken.source()
const promise = axios.get('/todos', {
// Pass the source token to your request
cancelToken: source.token,
})
// Cancel the request if React Query calls the `promise.cancel` method
promise.cancel = () => {
source.cancel('Query was cancelled by React Query')
}
return promise
})const [queryKey] = useState('todos')
const query = useQuery(queryKey, async ({ signal }) => {
const resp = await fetch('/todos', { signal })
return resp.json()
})
const queryClient = useQueryClient()
return (
<button onClick={(e) => {
e.preventDefault()
queryClient.cancelQueries(queryKey)
}}>Cancel</button>
)import axios from "axios";
import { ReactNode } from "react";
import {
DefaultOptions,
QueryClient,
QueryClientProvider as Provider,
} from "react-query";
import { ReactQueryDevtools } from "react-query/devtools";
const defaultOptions: DefaultOptions = {
queries: {
refetchOnReconnect: false,
refetchOnWindowFocus: false,
retry: (failureCount, error) =>
failureCount < 3 &&
!(axios.isAxiosError(error) && error?.response?.status === 401),
},
};
const queryClient = new QueryClient({ defaultOptions });
interface QueryClientProviderProps {
children: ReactNode;
}
export default function QueryClientProvider({
children,
}: QueryClientProviderProps) {
return (
<Provider client={queryClient}>
{children}
<ReactQueryDevtools initialIsOpen={false} />
</Provider>
);
}export default function App(){
<QueryClientProvider>
{children}
</QueryClientProvider>
}interface PageListApiResponse {
results: Page[];
maxPublishedPages: number;
}
export default function usePageListQuery(
state: PageState,
offset: number,
options: UseQueryOptions<PageListApiResponse, AxiosError<any>> = {}
) {
const axios = useContext(AxiosContext);
return useQuery({
queryKey: ["pageList", offset, state],
queryFn: async ({ queryKey }) => {
const { data } = await axios.get<PageListApiResponse>(
`${process.env.REACT_APP_API_URL}/pages?_limit=10&_start=${queryKey[1]}&state=${queryKey[2]}`
);
return data;
},
...options,
});
}const {
data: { results: listPagesData = [], maxPublishedPages = 0 } = {},
isLoading,
isFetching,
refetch,
} = usePageListQuery(listingStatus, pageOffset, {
onSuccess:(data)=> {...},
onError: (err)=> {...},
enabled: allCountData && allCountData.count > 0,
select: ({ results, ...data }) => ({
...data,
results: [...results].sort((a, b) => {
if (a.url === homePageSettings?.home) return -1;
if (b.url === homePageSettings?.home) return 1;
return 0;
}),
}),
});export default function usePageUpdateMutation({
onSuccess,
...options
}: MutationOptions<AxiosResponse<Page>, AxiosError<any>, Page> = {}) {
const axios = useContext(AxiosContext);
const queryClient = useQueryClient();
return useMutation({
mutationFn: (page: Page) =>
axios.put<Page>(
`${process.env.REACT_APP_API_URL}/pages/${page.id}`,
page
),
onSuccess: (data, variables, context) => {
if (onSuccess) onSuccess(data, variables, context);
// to clear the query,
// so that the query will be loaded again and trigger isLoading
queryClient.invalidateQueries("allPageList");
queryClient.invalidateQueries(["page", variables.id]);
// set the data to the existing query directly
queryClient.setQueryData(['test', variables.id], data)
},
...options,
});
}