loadGreeting((不是由更改props.currentStore 时的其他时间引起的
const [loadGreeting, { called, loading, data }] = useLazyQuery(
GET_COOKIES,
{ context: {
headers: {
"x-request-shop-id": props.currentStore ? props.currentStore.id : ""
},
}},
);
useEffect(() => {
if (props.currentStore.id) {
loadGreeting();// here it comes a change but does not cause other data props.correntStore
}
}, [props.currentStore ]);
默认情况下,查询使用cache-first
作为获取策略。因此,当服务器端的数据在缓存中可用时,ApolloClient不会在服务器端查询数据。
您应该将fetch策略更改为cache-and-network
,然后ApolloClient将在服务器端查询数据,即使它们在缓存中是否可用。
const [loadGreeting, { called, loading, data }] = useLazyQuery(GET_COOKIES, {
context: {
headers: {
'x-request-shop-id': props.currentStore ? props.currentStore.id : ''
}
},
fetchPolicy: 'cache-and-network'
});
useQuery
或useLazyQuery
是一个声明性React Hook。它并不意味着在接收数据的经典函数的意义上被调用。首先,确保理解React Hooks,或者暂时不使用它们(Stackoverflow上90%的问题都是因为人们试图同时学习太多东西(。Apollo文档对于使用渲染道具的官方react Apollo包来说非常好。这同样有效,一旦你了解了Apollo Client和Hooks,你就可以进行一点重构。所以你的问题的答案是:
如何多次调用useQuery?
您不会多次调用它。当查询结果可用或更新时,组件将自动重新提交。
我可以随时调用它吗?
否,钩子只能在顶级调用。相反,数据在您的函数中可以从上层范围(闭包(获得。