Eine Query-Funktion kann buchstäblich jede Funktion sein, die einen Promise zurückgibt. Der zurückgegebene Promise sollte entweder die Daten auflösen oder einen Fehler auslösen.
Alle folgenden Konfigurationen von Query-Funktionen sind gültig
useQuery({ queryKey: ['todos'], queryFn: fetchAllTodos })
useQuery({ queryKey: ['todos', todoId], queryFn: () => fetchTodoById(todoId) })
useQuery({
queryKey: ['todos', todoId],
queryFn: async () => {
const data = await fetchTodoById(todoId)
return data
},
})
useQuery({
queryKey: ['todos', todoId],
queryFn: ({ queryKey }) => fetchTodoById(queryKey[1]),
})
useQuery({ queryKey: ['todos'], queryFn: fetchAllTodos })
useQuery({ queryKey: ['todos', todoId], queryFn: () => fetchTodoById(todoId) })
useQuery({
queryKey: ['todos', todoId],
queryFn: async () => {
const data = await fetchTodoById(todoId)
return data
},
})
useQuery({
queryKey: ['todos', todoId],
queryFn: ({ queryKey }) => fetchTodoById(queryKey[1]),
})
Damit TanStack Query eine Query als fehlerhaft erkennt, muss die Query-Funktion einen Fehler auslösen oder einen abgelehnten Promise zurückgeben. Jeder Fehler, der in der Query-Funktion ausgelöst wird, wird im error-Status der Query gespeichert.
const { error } = useQuery({
queryKey: ['todos', todoId],
queryFn: async () => {
if (somethingGoesWrong) {
throw new Error('Oh no!')
}
if (somethingElseGoesWrong) {
return Promise.reject(new Error('Oh no!'))
}
return data
},
})
const { error } = useQuery({
queryKey: ['todos', todoId],
queryFn: async () => {
if (somethingGoesWrong) {
throw new Error('Oh no!')
}
if (somethingElseGoesWrong) {
return Promise.reject(new Error('Oh no!'))
}
return data
},
})
Während die meisten Utilities wie axios oder graphql-request automatisch Fehler für nicht erfolgreiche HTTP-Aufrufe auslösen, lösen einige Utilities wie fetch standardmäßig keine Fehler aus. In diesem Fall müssen Sie sie selbst auslösen. Hier ist eine einfache Methode, dies mit der beliebten fetch API zu tun.
useQuery({
queryKey: ['todos', todoId],
queryFn: async () => {
const response = await fetch('/todos/' + todoId)
if (!response.ok) {
throw new Error('Network response was not ok')
}
return response.json()
},
})
useQuery({
queryKey: ['todos', todoId],
queryFn: async () => {
const response = await fetch('/todos/' + todoId)
if (!response.ok) {
throw new Error('Network response was not ok')
}
return response.json()
},
})
Query Keys dienen nicht nur der eindeutigen Identifizierung der abgerufenen Daten, sondern werden auch praktisch als Teil des QueryFunctionContext an Ihre Query-Funktion übergeben. Obwohl nicht immer notwendig, macht dies die Extraktion Ihrer Query-Funktionen bei Bedarf möglich.
const result = useQuery({
queryKey: ['todos', { status, page }],
queryFn: fetchTodoList,
})
// Access the key, status and page variables in your query function!
function fetchTodoList({ queryKey }) {
const [_key, { status, page }] = queryKey
return new Promise()
}
const result = useQuery({
queryKey: ['todos', { status, page }],
queryFn: fetchTodoList,
})
// Access the key, status and page variables in your query function!
function fetchTodoList({ queryKey }) {
const [_key, { status, page }] = queryKey
return new Promise()
}
Der QueryFunctionContext ist das Objekt, das an jede Query-Funktion übergeben wird. Er besteht aus:
Zusätzlich erhalten Infinite Queries die folgenden Optionen übergeben: