apollo useLazyQuery绕过缓存



我正在使用@apollo/clientuseLazyQuery挂钩在我的应用程序中构建遗忘功能。当我第一次点击按钮时,它会发送电子邮件并调用后端API,但当我第二次点击时,以此类推……它只会返回从后端做出的先前响应,意味着不会点击后端API。

export const Form: React.FC<Props> = ({ setStatus }) => {
const [getResetLink, { loading, data }] = useLazyQuery(FORGOT_PASSWORD)

console.log(data, loading, " => Query")
const onSubmit = (data: any) => {
const email = data[" "]
getResetLink({ variables: { email } })
}
return (
<form onSubmit={handleSubmit(onSubmit)}>
<Input
label=" "
placeholder="eg. alex@gmail.com"
register={register}
required={true}
/>
<Button btnType={true} type="primary" width="100%">
Submit
</Button>
</form>
)
}

不用担心表格,我用的是react hook form。只需要解决问题。让我们假设,一个用户忘记了一个密码,他把它放在一封电子邮件里。不幸的是,他第一次尝试时没有收到电子邮件。他会再试一次,但现在他接受了之前的响应,不会再向后端发出请求。我确信apollo useLazyQuery有问题。我们如何绕过缓存?基本上,它从缓存中返回数据。

提前感谢您宝贵的答案!

您可以重写挂钩,将提取策略设置为"无缓存"或"仅网络">

const [getResetLink, { loading, data }] = useLazyQuery(FORGOT_PASSWORD, {fetchPolicy: 'no-cache'})

另一方面,您应该考虑使用"突变"而不是"查询"进行此操作,因为数据可能会发生一些变化。例如,您存储用于重置密码或类似内容的唯一哈希或链接。

或者,您可以使用带有跳过选项的useQuery和refetch结果函数。默认情况下,Refetch将始终更新缓存。

大致如下:

const { refetch: getResetLink, loading, data } = useQuery(FORGOT_PASSWORD, { skip: true } )

然后在提交getResetLink({ email })

https://www.apollographql.com/docs/react/data/queries/#refetching

一个函数,使您能够重新执行查询,并可选地传入新变量。为了保证refetch执行网络请求,其fetchPolicy设置为仅网络(除非原始查询的fetchPolicy没有缓存或缓存和网络,这也保证了网络请求(

最新更新