🐶
TanStack Queryでデータの変更に合わせて別のデータを再取得する
背景
例えばTODOアプリを想定したときに、TODOの追加に合わせてTODOリストを更新(再取得)したいということがあります。
データを変更(TODOを追加)したときに、それにともなう別のデータ(TODOリスト)を更新しないとViewが古くなってしまう一例です。
useMutationのonSuccessでinvalidateQueriesを実行する
invalidateQueries
メソッドを実行することでキャッシュが古くなったとみなし、データを再取得することができます。
これをuseMutation
のonSuccess
メソッドと組み合わせることで、TODOの追加に合わせてTODO一覧を再取得することができます。
import { useMutation, useQueryClient } from '@tanstack/react-query';
const queryClient = useQueryClient();
const todos = useQuery({ queryKey: ['todos'], queryFn: fetchTodos })
const mutation = useMutation({
mutationFn: addTodo,
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['todos'] });
},
})
addTodo
が成功したときにtodos
というキーが指定されたクエリを再取得します。
ちなみにですが、invalidateQueries
に指定するクエリは、複数のクエリを部分一致でマッチさせることもできます。
以下の例では、todos
という接頭辞を使って、todos
で始まるクエリのキャッシュが古くなったとみなすことができます。
import { useQuery, useQueryClient } from '@tanstack/react-query'
const queryClient = useQueryClient()
queryClient.invalidateQueries({ queryKey: ['todos'] })
// Both queries below will be invalidated
const todoListQuery = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
})
const todoListQuery = useQuery({
queryKey: ['todos', { page: 1 }],
queryFn: fetchTodoList,
})
参考
Discussion