关于 angular-query
这是使用 @tanstack/angular-query-experimental 的技能指南,该库将 TanStack Query 集成到 Angular,用于获取和管理服务端状态。内容涵盖基于 Signal 的 API、可复用查询选项与缓存更新。
主要功能
- 01基于 Signal 的 injectQuery 和 injectMutation
- 02通过查询选项复用配置
- 03处理加载与错误状态
- 04缓存失效与乐观更新
- 05集成 Angular Query DevTools
适用场景
- 01在 Angular 组件中获取服务端数据
- 02在服务间复用查询配置
- 03在变更后更新缓存数据
- 04使用 DevTools 调试查询
安装
复制下面的命令,在终端中运行。
$
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