query 是对异步数据源的声明性依赖,它与唯一键关联。query 可以与任何基于 Promise 的方法(包括 GET 和 POST 方法)一起使用,以从服务器获取数据。如果你的方法修改了服务器上的数据,我们建议使用 Mutations 代替。
要在你的组件或自定义 hooks 中订阅 query,请调用 useQuery hook,至少需要
import { useQuery } from '@tanstack/react-query'
function App() {
const info = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })
}
import { useQuery } from '@tanstack/react-query'
function App() {
const info = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })
}
你提供的唯一键在内部用于重新获取、缓存和在整个应用程序中共享你的 queries。
由 useQuery 返回的 query 结果包含关于 query 的所有信息,你将在模板和数据的任何其他用法中需要这些信息
const result = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })
const result = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })
result 对象包含一些非常重要的状态,你需要注意这些状态才能高效工作。query 在任何给定时刻只能处于以下状态之一
除了这些主要状态之外,还有更多信息可用,具体取决于 query 的状态
对于大多数 queries,通常只需检查 isPending 状态,然后检查 isError 状态,最后,假设数据可用并渲染成功状态
function Todos() {
const { isPending, isError, data, error } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
})
if (isPending) {
return <span>Loading...</span>
}
if (isError) {
return <span>Error: {error.message}</span>
}
// We can assume by this point that `isSuccess === true`
return (
<ul>
{data.map((todo) => (
<li key={todo.id}>{todo.title}</li>
))}
</ul>
)
}
function Todos() {
const { isPending, isError, data, error } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
})
if (isPending) {
return <span>Loading...</span>
}
if (isError) {
return <span>Error: {error.message}</span>
}
// We can assume by this point that `isSuccess === true`
return (
<ul>
{data.map((todo) => (
<li key={todo.id}>{todo.title}</li>
))}
</ul>
)
}
如果布尔值不是你喜欢的,你也可以使用 status 状态
function Todos() {
const { status, data, error } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
})
if (status === 'pending') {
return <span>Loading...</span>
}
if (status === 'error') {
return <span>Error: {error.message}</span>
}
// also status === 'success', but "else" logic works, too
return (
<ul>
{data.map((todo) => (
<li key={todo.id}>{todo.title}</li>
))}
</ul>
)
}
function Todos() {
const { status, data, error } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
})
if (status === 'pending') {
return <span>Loading...</span>
}
if (status === 'error') {
return <span>Error: {error.message}</span>
}
// also status === 'success', but "else" logic works, too
return (
<ul>
{data.map((todo) => (
<li key={todo.id}>{todo.title}</li>
))}
</ul>
)
}
如果你已经检查了 pending 和 error,TypeScript 也会正确缩小 data 的类型。
除了 status 字段之外,你还将获得一个额外的 fetchStatus 属性,其中包含以下选项
后台重新获取和 stale-while-revalidate 逻辑使 status 和 fetchStatus 的所有组合都成为可能。例如
因此请记住,query 可能处于 pending 状态,但实际上并未获取数据。作为经验法则
有关执行状态检查的另一种方法,请查看 社区资源。