【发布时间】:2020-12-20 05:07:03
【问题描述】:
我正在浏览 Apollo React hooks 的文档。
看到有两个查询钩子可以使用useQuery 和useLazyQuery
我正在阅读此页面。 https://www.apollographql.com/docs/react/api/react/hooks/
谁能解释一下它们之间有什么区别以及在什么情况下应该使用它。
【问题讨论】:
我正在浏览 Apollo React hooks 的文档。
看到有两个查询钩子可以使用useQuery 和useLazyQuery
我正在阅读此页面。 https://www.apollographql.com/docs/react/api/react/hooks/
谁能解释一下它们之间有什么区别以及在什么情况下应该使用它。
【问题讨论】:
当useQuery被组件调用时,后续会触发查询。
但是当useLazyQuery被调用时,并没有触发后续的查询,而是返回一个可以用来手动触发查询的函数。
在此页面上进行了说明:
https://www.apollographql.com/docs/react/data/queries/#executing-queries-manually
当 React 挂载并渲染一个调用
useQuery的组件时 hook,Apollo Client 会自动执行指定的查询。 但是,如果您想执行查询以响应不同的事件,例如用户单击按钮,该怎么办?useLazyQuery钩子非常适合执行查询以响应组件渲染以外的事件。 这个钩子的作用就像useQuery,除了一个关键的例外:当useLazyQuery被调用时,它不会立即执行它的关联 询问。 相反,它会在结果元组中返回一个函数,您可以在准备好执行查询时调用该函数。
【讨论】:
假设您有一个调用 useQuery 的组件,那么一旦组件挂载,useQuery 就会运行并从服务器获取数据。 但是,如果您在该组件中使用 useLazyQuery 而不是 useQuery,则查询不会运行,并且在组件安装时不会获取数据。相反,您可以根据您的要求运行查询,例如在单击按钮后。示例:
import React, { useState } from 'react';
import { useLazyQuery } from '@apollo/client';
function DelayedQuery() {
const [dog, setDog] = useState(null);
const [getDog, { loading, data }] = useLazyQuery(GET_DOG_PHOTO);
if (loading) return <p>Loading ...</p>;
if (data && data.dog) {
setDog(data.dog);
}
return (
<div>
{dog && <img src={dog.displayImage} />}
<button onClick={() => getDog({ variables: { breed: 'bulldog' } })}>
Click me!
</button>
</div>
);
}
在这里,只要您单击按钮,就只会运行查询并获取数据并显示图像。但是,如果您改用 useQuery,则在单击按钮之前(即当组件挂载时),数据将被获取并显示图像
【讨论】:
更新:
useLazyQuery 现在返回 Apollo Client 3.5.0 (2021-11-08) 的承诺
【讨论】: