Blog>
Snippets

Implementing Cache Invalidation with React Query

Showcase how to manually invalidate a query's cache with React Query after a specific event, such as submitting a form. This example includes the setup for a form submission that triggers cache invalidation to ensure fresh data is fetched on subsequent queries.
import { useMutation, useQueryClient } from 'react-query';

const updateUserData = async (userData) => {
  // Let's imagine this function sends updated user data to your server
  // and the server returns updated user data.
  return fetch('/api/user/update', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(userData),
  }).then(res => res.json());
};
First, we import useMutation and useQueryClient from React Query. The updateUserData function is an example of an asynchronous function that sends the updated user data to a server endpoint and expects updated user data in response. This function will be used in the mutation.
const UserProfileForm = () => {
  const queryClient = useQueryClient();

  const { mutate } = useMutation(updateUserData, {
    onSuccess: () => {
      // Invalidate and refetch
      queryClient.invalidateQueries('userData');
    },
  });

  const handleSubmit = async (event) => {
    event.preventDefault();
    const formData = new FormData(event.target);
    const userData = Object.fromEntries(formData.entries());
    mutate(userData);
  };

  return (
    // Form markup goes here
  );
};
This piece of code defines a form component that uses the `useMutation` hook to update user data. On successful mutation, it invalidates the cache for a query with the key 'userData' using `invalidateQueries` method, ensuring that React Query fetches fresh data next time it's requested. The `handleSubmit` function is attached to the form's onSubmit event, gathering form data and triggering the mutation. Replace `// Form markup goes here` with your actual form JSX.