SWR在组件卸载后还会触发setState吗?
我用SWR请求数据,但在组件卸载后好像还报了警告,说不能在已卸载的组件上setState。是不是SWR没处理好取消逻辑?
我试过在useEffect里加了取消标志,但感觉SWR应该自己处理了才对。代码大概是这样:
const { data, error } = useSWR('/api/user', fetcher);
if (error) return <div>failed</div>;
if (!data) return <div>loading...</div>;
return <div>{data.name}</div>;
1. SWR会在组件卸载后自动取消请求,但如果你在fetcher里手动调用了setState就会有问题
2. 或者你在组件里用了其他副作用操作没清理
一般这样处理最稳妥:
如果问题还在,检查下你的fetcher函数里有没有直接操作组件状态的代码。SWR本身不会在卸载后setState,但如果你在fetcher里写了类似这样的代码就会有问题:
另外可以升级到最新版SWR,他们在这方面处理得越来越好了。
你贴的这段代码本身是没问题的。如果还在报错,大概率是你的 fetcher 函数里做了什么骚操作,或者你在 if 条件里调用了 useSWR(这是大忌,Hook 必须在顶层调用)。
确保你的 fetcher 是个纯净的 Promise 返回函数,就像下面这样:
只要保证 fetcher 逻辑简单,SWR 就能搞定剩下的。如果是 SWR 2.0 版本,它还会自动 abort 掉请求,连网都不费了。