SWR在React组件卸载时如何取消未完成的请求?
我在用SWR获取用户数据时,发现组件卸载后还在发起请求,控制台报错说”Can’t cancel mutate…”。我试过在useEffect的清理函数里调用mutate.cancel,但好像没生效。
代码大概是这样写的:
import useSWR from 'swr'
function UserPage({ userId }) {
const { data, mutate } = useSWR(`user/${userId}`, fetchUser)
useEffect(() => {
return () => mutate.cancel() // 这里应该有问题?
}, [mutate])
return {data?.name}
}
如果把mutate取消的逻辑改成在fetch函数里返回abortController,会不会更可靠?或者SWR有内置的取消机制没用对?
你用
mutate.cancel()的方式不对,应该用useEffect返回的函数来取消未完成的请求,但要在useSWR的配置里设置revalidateOnMount: false。改法如下:
SWR 内部已经处理了 AbortController,不需要自己返回。你手动调用
mutate.cancel()是多余的。如果还是不行,确保SWR版本是最新,老版本确实有些bug。