我正在使用React-query进行API调用。我想知道是否有一种方法可以用一种懒惰的方式调用查询。
表示仅当查询参数更改时调用查询。
这是我目前拥有的;我正在使用一个带有“useEffect”的hack,如果recipeName发生变化,则运行refetch函数。
export const searchRecipeByName = async (recipeName: string) => {
return await api.get(
`/recipes/complexSearch?apiKey=${process.env.NEXT_PUBLIC_SPOONACULAR_API_KEY}&query=${recipeName}&addRecipeInformation=true&fillIngredients=true`
);
};
const [recipeName, setRecipeName] = useState("");
const { data, refetch } = useQuery(
"homePageSearchQuery",
() => searchRecipeByName(recipeName),
{ enabled: false }
);
// HACK
useEffect(() => {
if (!!recipeName) {
refetch();
}
}, [recipeName]);
const handleOnSearchSubmit = async (recipeSearch: RecipeSearch) => {
setRecipeName(recipeSearch.search);
};
我最好在“handleOnSearchSubmit”函数中调用查询。
我可以创建一个定制的useLazyQuery钩子来处理这个问题,但是我想知道React-query是否有一个本地的方法来处理这个问题。
4条答案
按热度按时间unhi4e5o1#
我最好在“handleOnSearchSubmit”函数中调用查询。
这是一种非常命令式的思考方式,但是react-query更像是声明式的,你不需要指定:“当我点击那个按钮时,我想获取”,但你只是说:“这些是我需要的输入”,并且只要这些输入改变,react-query就会重新获取。
因此,您要做的是将查询运行所需的内容 * 放入 * 查询键中,以便react-query
然后,您需要做的就是在
handleOnSearchSubmit
中调用setRecipeName
,react-query将执行查询。还有一些你可能需要考虑的事情:
recipeName
更改之间的硬加载状态,请设置keepPreviousData: true
recipeName
发生变化时都会运行一个查询。如果在单击按钮时没有发生这种情况,而是说每当用户在输入字段中键入内容时,您都需要对它进行反跳。对于这些情况,请考虑useDebounce:这将允许您输入数据并将其显示在文本字段中,但仅在1秒不活动后创建一个新的缓存条目/触发一个新请求。
wz1wpwve2#
您可以使用这个Wrapper钩子在
react-query
中创建useLazyQuery
bvjxkvbb3#
像这样做
每当recipeName的值发生更改时,它都会运行查询。
vbkedwbf4#
惰性查询可以通过以下方式实现:
使用方法: