SWR预加载数据后为什么组件还是闪一下加载状态?
我在用SWR做数据预加载,明明在进入页面前就调用了preload,但组件首次渲染时还是会短暂显示loading状态,感觉预加载没生效,这是为啥?
我试过在路由跳转前手动触发fetch,也确认了缓存key是一样的,但问题依旧。代码大概是这样:
const { data, isValidating } = useSWR('/api/user', fetcher);
if (isValidating && !data) {
return <div>Loading...</div>;
}
return <div>{data.name}</div>;
1. 预加载时机太晚:确认下你是不是在路由跳转后才调用
preload。最好在用户hover按钮或点击前就预加载,给请求留出时间。2. 缓存没同步:虽然key一样,但检查下是不是在不同SWR实例里。可以用
useSWRConfig共享缓存:3. fallback数据没设置:在SWR配置里加上
fallbackData:4. React hydration问题:如果是SSR,确保服务端和客户端初始数据一致。可以用
initialData配合。我一般用方案2+3组合拳,先mutate全局缓存,再设置fallbackData,基本能干掉那个烦人的loading闪屏。