mcpField
A
angular-query

angular-query

github.com/oguzhan18开发7160 次安装31 周前更新
代码仓库

关于 angular-query

这是使用 @tanstack/angular-query-experimental 的技能指南,该库将 TanStack Query 集成到 Angular,用于获取和管理服务端状态。内容涵盖基于 Signal 的 API、可复用查询选项与缓存更新。

主要功能

  1. 01基于 Signal 的 injectQuery 和 injectMutation
  2. 02通过查询选项复用配置
  3. 03处理加载与错误状态
  4. 04缓存失效与乐观更新
  5. 05集成 Angular Query DevTools

适用场景

  1. 01在 Angular 组件中获取服务端数据
  2. 02在服务间复用查询配置
  3. 03在变更后更新缓存数据
  4. 04使用 DevTools 调试查询

安装

复制下面的命令,在终端中运行。

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

评论

支持 Markdown