SWR预加载数据后为什么组件还是会闪一下加载状态?
我在用SWR做数据预加载,明明在进入页面前就调用了fetcher,但组件首次渲染时还是会短暂显示loading状态,体验很不好。是我预加载的方式不对吗?
我是在路由跳转前这样预加载的:
import { mutate } from 'swr'
// 跳转前预加载
mutate('/api/user', fetchUser())
// 页面组件里
const { data, isValidating } = useSWR('/api/user', fetchUser)
if (isValidating && !data) return <div>Loading...</div>
按理说mutate已经把数据塞进缓存了,为什么useSWR第一次还是拿不到data,非要等一轮revalidate?
所以你mutate进去的数据确实在缓存里,但useSWR一挂载就触发了revalidate,isValidating瞬间变true,你的loading条件
isValidating && !data就成立了,loading状态就这么闪了一下。解决办法很简单,给useSWR加个配置项关掉首次挂载的自动revalidate: