Blog>
Snippets

Implementing Custom Query Invalidation

Provide an example of customizing query invalidation logic by using the invalidateQueries method after a mutation, to ensure data consistency across the application.
import { useMutation, useQueryClient } from 'react-query';

const updateTodo = async (todo) => {
  // Assuming axios is imported and set up
  return axios.put(`/todos/${todo.id}`, todo);
};

const TodoUpdater = () => {
  const queryClient = useQueryClient();

  const mutation = useMutation(updateTodo, {
    onSuccess: () => {
      // Custom query invalidation logic
      queryClient.invalidateQueries('todos', {
        refetchInactive: true,
        // Invalidate based on a custom predicate
        predicate: (query) => query.queryKey[1].status === 'completed'
      });
    },
  });

  // Event handler to trigger the mutation
  const handleUpdateTodo = (todo) => {
    mutation.mutate({ ...todo, status: 'completed' });
  };

  return (
    // JSX structure
  );
};
This example demonstrates how to use the 'useMutation' hook from React Query to update a todo item. After the mutation succeeds, it uses a custom invalidation logic inside 'invalidateQueries' to only refetch queries for 'todos' marked as 'completed'. The predicate function filters queries based on condition, allowing selective invalidation.