web*_*ber 15 javascript reactjs react-query
我正在使用 React-query 进行 API 调用。我想知道是否有一种方法可以以惰性方式调用查询。
意味着仅当查询参数更改时才调用查询。
这就是我目前所拥有的;我正在使用一个 hack,其中useEffect
ifrecipeName
更改,然后运行该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`
);
};
Run Code Online (Sandbox Code Playgroud)
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);
};
Run Code Online (Sandbox Code Playgroud)
最好,我想在函数中调用查询handleOnSearchSubmit
。
我可以创建一个自定义useLazyQuery
钩子来处理这个问题,但我想知道 React-query 是否有本地方法来处理这个问题。
TkD*_*odo 14
最好,我想在“handleOnSearchSubmit”函数中调用查询。
这是一种非常必要的思考方式,但反应查询更具声明性。您没有指定:“当我单击该按钮时,我想要获取”,但您只是说:“这些是我需要的输入”,并且只要这些输入发生变化,react-query就会重新获取。
所以你要做的就是把查询运行所需的东西放入查询键中,这样react-query
const [recipeName, setRecipeName] = React.useState('')
const { isLoading, data } = useQuery(
['homePageSearchQuery', recipeName],
() => searchRecipeByName(recipeName),
{
enabled: !!recipeName
}
])
Run Code Online (Sandbox Code Playgroud)
然后,你需要做的就是调用setRecipeName
,handleOnSearchSubmit
react-query 就会进行查询。
您可能还需要考虑其他一些事情:
recipeName
更改之间的硬加载状态,请设置keepPreviousData: true
recipeName
。如果单击按钮时没有发生这种情况,但每当用户在输入字段中键入内容时,您都希望消除这种情况。对于这些情况,请考虑useDebounce之类的东西:const [recipeName, setRecipeName] = React.useState('')
const debouncedRecipeName = useDebounce(recipeName, 1000)
const { isLoading, data } = useQuery(
['homePageSearchQuery', debouncedRecipeName],
() => searchRecipeByName(debouncedRecipeName),
{
enabled: !!debouncedRecipeName
}
])
Run Code Online (Sandbox Code Playgroud)
这将允许您输入数据并将其显示在文本字段中,但仅创建一个新的缓存条目/在 1 秒不活动后触发一个新请求。
归档时间: |
|
查看次数: |
24711 次 |
最近记录: |