mcpField
A
angular-query

angular-query

github.com/oguzhan18開発7160 回インストール31 週間前に更新
リポジトリ

angular-query について

@tanstack/angular-query-experimentalを使い、AngularでTanStack Queryによるサーバー状態の取得と管理を行うためのスキルガイドです。SignalベースのAPI、再利用可能なクエリ設定、キャッシュ更新を扱います。

主な機能

  1. 01SignalベースのinjectQueryとinjectMutation
  2. 02クエリオプションによる設定の再利用
  3. 03読み込み・エラー状態の処理
  4. 04キャッシュ無効化と楽観的更新
  5. 05Angular Query DevToolsとの連携

活用シーン

  1. 01Angularコンポーネントでサーバーデータを取得
  2. 02サービス間でクエリ設定を再利用
  3. 03ミューテーション後にキャッシュを更新
  4. 04DevToolsでクエリをデバッグ

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/oguzhan18/angular-ecosystem-skills --skill angular-query

インストール後、Claude Code で/angular-queryを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/discussions/
_INDEX.md
references/docs/
_INDEX.md
references/issues/
_INDEX.md
references/releases/
_INDEX.md

詳細

@tanstack/angular-query-experimental

バージョン: 5.x (2025) タグ: データフェッチ、サーバー状態、キャッシュ、TanStack Query

参考情報: ドキュメント • GitHub • npm

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);
  }
}));

コメント