angular-query について
@tanstack/angular-query-experimentalを使い、AngularでTanStack Queryによるサーバー状態の取得と管理を行うためのスキルガイドです。SignalベースのAPI、再利用可能なクエリ設定、キャッシュ更新を扱います。
主な機能
- 01SignalベースのinjectQueryとinjectMutation
- 02クエリオプションによる設定の再利用
- 03読み込み・エラー状態の処理
- 04キャッシュ無効化と楽観的更新
- 05Angular Query DevToolsとの連携
活用シーン
- 01Angularコンポーネントでサーバーデータを取得
- 02サービス間でクエリ設定を再利用
- 03ミューテーション後にキャッシュを更新
- 04DevToolsでクエリをデバッグ
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ oguzhan18/ angular-ecosystem-skills --skill angular-queryインストール後、Claude Code で/angular-queryを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/discussions/_INDEX.mdreferences/docs/_INDEX.mdreferences/issues/_INDEX.mdreferences/releases/_INDEX.md詳細
@tanstack/angular-query-experimental
バージョン: 5.x (2025) タグ: データフェッチ、サーバー状態、キャッシュ、TanStack Query
API の変更点
このセクションでは、バージョン固有の API の変更点について説明します。
-
新機能:Angular Query v5 — TanStack Query のシグナルベース API ソース
-
新機能:
injectQuery— シグナルベースのクエリ注入 -
新機能:
injectMutation— シグナルベースのミューテーション注入 -
新機能:クエリオプションパターン — サービスベースのクエリ設定
-
新機能:DevTools 統合 — デバッグ用 Angular Query DevTools
ベストプラクティス
- インストールとセットアップ
npm install @tanstack/angular-query-experimental
import { provideHttpClient } from '@angular/common/http';
import { provideTanStackQuery } from '@tanstack/angular-query-experimental';
import { QueryClient } from '@tanstack/query-core';
export const appConfig: ApplicationConfig = {
providers: [
provideHttpClient(),
provideTanStackQuery(new QueryClient())
]
};
- データフェッチには injectQuery を使用する
import { injectQuery } from '@tanstack/angular-query-experimental';
@Component({})
export class TodosComponent {
private http = inject(HttpClient);
query = injectQuery(() => ({
queryKey: ['todos'],
queryFn: () => lastValueFrom(this.http.get<Todo[]>('/api/todos'))
}));
}
- シグナルを使ってテンプレートで使用する
@Component({
template: `
@if (query.isPending()) {
Loading...
} @else if (query.isError()) {
Error: {{ query.error().message }}
} @else {
@for (todo of query.data(); track todo.id) {
{{ todo.title }}
}
}
`
})
export class TodosComponent {
query = injectQuery(() => ({ ... }));
}
- データの変更にはミューテーションを使用する
import { injectMutation, injectQueryClient } from '@tanstack/angular-query-experimental';
@Component({})
export class AddTodoComponent {
private http = inject(HttpClient);
private queryClient = injectQueryClient();
mutation = injectMutation(() => ({
mutationFn: (newTodo: string) =>
lastValueFrom(this.http.post('/api/todos', { title: newTodo })),
onSuccess: () => {
this.queryClient.invalidateQueries({ queryKey: ['todos'] });
}
}));
addTodo(title: string) {
this.mutation.mutate(title);
}
}
- 再利用可能なクエリにはクエリオプションを使用する
@Injectable({ providedIn: 'root' })
export class TodoService {
private http = inject(HttpClient);
getTodoOptions = (id: number) => queryOptions({
queryKey: ['todo', id],
queryFn: () => lastValueFrom(this.http.get(`/api/todos/${id}`))
});
}
@Component({})
export class TodoComponent {
private todoService = inject(TodoService);
todo = this.todoService.getTodoOptions(1);
}
- 読み込み状態とエラー状態を処理する
query = injectQuery(() => ({
queryKey: ['todos'],
queryFn: () => fetchTodos(),
retry: 3,
staleTime: 1000 * 60 * 5, // 5 minutes
refetchOnWindowFocus: false
}));
- キャッシュの更新には無効化を使用する
mutation = injectMutation(() => ({
mutationFn: createTodo,
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['todos'] });
}
}));
- 楽観的更新を使用する
mutation = injectMutation(() => ({
mutationFn: updateTodo,
onMutate: async (newTodo) => {
await queryClient.cancelQueries({ queryKey: ['todos'] });
const previousTodos = queryClient.getQueryData(['todos']);
queryClient.setQueryData(['todos'], (old: Todo[]) => [...old, newTodo]);
return { previousTodos };
},
onError: (err, newTodo, context) => {
queryClient.setQueryData(['todos'], context.previousTodos);
}
}));
コメント
Markdown 対応