查询是对异步数据源的声明性依赖,它与一个唯一键相关联。查询可以与任何基于 Promise 的方法(包括 GET 和 POST 方法)一起使用以从服务器获取数据。如果您的方法修改服务器上的数据,我们建议改用变更。
要订阅组件或自定义钩子中的查询,请至少使用以下内容调用 useQuery 钩子:
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 })
}
您提供的唯一键在内部用于在整个应用程序中重新获取、缓存和共享您的查询。
useQuery 返回的查询结果包含您模板化和任何其他数据用法所需的所有查询信息:
const result = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })
const result = useQuery({ queryKey: ['todos'], queryFn: fetchTodoList })
result 对象包含一些您需要了解才能高效工作的重要状态。在任何给定时刻,查询只能处于以下状态之一:
除了这些主要状态之外,根据查询的状态还可以��用更多信息:
对于大多数查询,通常足以检查 isPending 状态,然后是 isError 状态,最后假设数据可用并呈现成功状态:
function Todos() {
const { isPending, isError, data, error } = useQuery({
queryKey: ['todos'],
queryFn: fetchTodoList,
})
if (isPending) {
return <span>加载中...</span>
}
if (isError) {
return <span>错误:{error.message}</span>
}
// 此时我们可以假设 `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>加载中...</span>
}
if (isError) {
return <span>错误:{error.message}</span>
}
// 此时我们可以假设 `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>加载中...</span>
}
if (status === 'error') {
return <span>错误:{error.message}</span>
}
// 也是 status === 'success',但“else”逻辑也有效
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>加载中...</span>
}
if (status === 'error') {
return <span>错误:{error.message}</span>
}
// 也是 status === 'success',但“else”逻辑也有效
return (
<ul>
{data.map((todo) => (
<li key={todo.id}>{todo.title}</li>
))}
</ul>
)
}
如果您在访问 data 之前检查了 pending 和 error,TypeScript 也会正确地缩小 data 的类型。
除了 status 字段之外,您还将获得一个额外的 fetchStatus 属性,其中包含以下选项:
后台重新获取和 stale-while-revalidate 逻辑使得 status 和 fetchStatus 的所有组合都成为可能。例如:
因此,请记住,查询可以处于 pending 状态而无需实际获取数据。经验法则是:
有关执行状态检查的替代方法,请参阅社区资源。