Eine Abfrage ist eine deklarative Abhängigkeit von einer asynchronen Datenquelle, die an einen eindeutigen Schlüssel gebunden ist. Eine Abfrage kann mit jeder Promise-basierten Methode (einschließlich GET- und POST-Methoden) verwendet werden, um Daten von einem Server abzurufen. Wenn Ihre Methode Daten auf dem Server modifiziert, empfehlen wir stattdessen die Verwendung von Mutationen.
Um Ihre Komponenten oder Dienste mit einer Abfrage zu abonnieren, rufen Sie injectQuery mit mindestens Folgendem auf:
import { injectQuery } from '@tanstack/angular-query-experimental'
export class TodosComponent {
info = injectQuery(() => ({ queryKey: ['todos'], queryFn: fetchTodoList }))
}
import { injectQuery } from '@tanstack/angular-query-experimental'
export class TodosComponent {
info = injectQuery(() => ({ queryKey: ['todos'], queryFn: fetchTodoList }))
}
Der eindeutige Schlüssel, den Sie angeben, wird intern für das erneute Abrufen, Caching und Teilen Ihrer Queries in Ihrer gesamten Anwendung verwendet.
Das von injectQuery zurückgegebene Abfrageergebnis enthält alle Informationen über die Abfrage, die Sie für die Vorlagenerstellung und jede andere Verwendung der Daten benötigen.
result = injectQuery(() => ({ queryKey: ['todos'], queryFn: fetchTodoList }))
result = injectQuery(() => ({ queryKey: ['todos'], queryFn: fetchTodoList }))
Das result-Objekt enthält einige sehr wichtige Zustände, die Sie kennen müssen, um produktiv zu sein. Eine Query kann zu jedem Zeitpunkt nur in einem der folgenden Zustände sein:
Zusätzlich zu diesen primären Zuständen stehen je nach Zustand der Query weitere Informationen zur Verfügung.
Für die meisten Queries ist es in der Regel ausreichend, den isPending-Zustand zu prüfen, dann den isError-Zustand und schließlich davon auszugehen, dass die Daten verfügbar sind, und den erfolgreichen Zustand zu rendern.
@Component({
selector: 'todos',
standalone: true,
template: `
@if (todos.isPending()) {
<span>Loading...</span>
} @else if (todos.isError()) {
<span>Error: {{ todos.error()?.message }}</span>
} @else {
<!-- We can assume by this point that status === 'success' -->
@for (todo of todos.data(); track todo.id) {
<li>{{ todo.title }}</li>
} @empty {
<li>No todos found</li>
}
}
`,
})
export class PostsComponent {
todos = injectQuery(() => ({
queryKey: ['todos'],
queryFn: fetchTodoList,
}))
}
@Component({
selector: 'todos',
standalone: true,
template: `
@if (todos.isPending()) {
<span>Loading...</span>
} @else if (todos.isError()) {
<span>Error: {{ todos.error()?.message }}</span>
} @else {
<!-- We can assume by this point that status === 'success' -->
@for (todo of todos.data(); track todo.id) {
<li>{{ todo.title }}</li>
} @empty {
<li>No todos found</li>
}
}
`,
})
export class PostsComponent {
todos = injectQuery(() => ({
queryKey: ['todos'],
queryFn: fetchTodoList,
}))
}
Wenn Booleans nicht Ihr Ding sind, können Sie auch den status-Zustand verwenden.
@Component({
selector: 'todos',
standalone: true,
template: `
@switch (todos.status()) {
@case ('pending') {
<span>Loading...</span>
}
@case ('error') {
<span>Error: {{ todos.error()?.message }}</span>
}
<!-- also status === 'success', but "else" logic works, too -->
@default {
<ul>
@for (todo of todos.data(); track todo.id) {
<li>{{ todo.title }}</li>
} @empty {
<li>No todos found</li>
}
</ul>
}
}
`,
})
class TodosComponent {}
@Component({
selector: 'todos',
standalone: true,
template: `
@switch (todos.status()) {
@case ('pending') {
<span>Loading...</span>
}
@case ('error') {
<span>Error: {{ todos.error()?.message }}</span>
}
<!-- also status === 'success', but "else" logic works, too -->
@default {
<ul>
@for (todo of todos.data(); track todo.id) {
<li>{{ todo.title }}</li>
} @empty {
<li>No todos found</li>
}
</ul>
}
}
`,
})
class TodosComponent {}
TypeScript wird auch den Typ von data korrekt einschränken, wenn Sie vor dem Zugriff darauf auf pending und error geprüft haben.
Zusätzlich zum status-Feld erhalten Sie eine zusätzliche fetchStatus-Eigenschaft mit den folgenden Optionen:
Hintergrundaktualisierungen und Stale-While-Revalidate-Logik machen alle Kombinationen für status und fetchStatus möglich. Zum Beispiel:
Denken Sie also daran, dass eine Query im pending-Zustand sein kann, ohne tatsächlich Daten abzurufen. Als Faustregel gilt: