我遇到了一些关于 mutate(key) 的意外行为的问题。在我的数据获取代码中,我有这些钩子/函数:
const recentOptions = {
refreshInterval: 0,
revalidateOnFocus: false,
dedupingInterval: 180000000 //or 500
}
export const useRecent = () => {
const {data, error} = useSWR(
`${config.apiUrl}/GetRecentFoundations`,
getThenResolve,
recentOptions
);
return {
recent: data,
isLoading: !error && !data,
isError: error
};
}
export const setRecent = async(fid) => {
await postThenResolve(
`${config.apiUrl}/SetFoundationRecent`,
{fid});
//TODO: So the behavior I am seeing tends to indicate that
//mutate(key) sends out a message to swr to refetch, but doesn't
//necessarily cause the cache to be invalidated.
//This means that mutate will cause any CURRENTLY MOUNTED useSWR()
//to refetch and re-render, but ones that aren't mounted will
//return with stale data.
mutate(`${config.apiUrl}/GetRecentFoundations`);
}
我还有一个使用 useRecent() 获取数据的组件:
const FoundationRecents = props => {
const {recent, isLoading} = useRecent();
if(isLoading) return <div>...LOADING...</div>;
if(!recent) return null;
return <SimpleCard
titlebg={colors.blue}
titlefg={colors.white}
titlesz='small'
title='Recent'
contentbg={colors.white}
component={<FoundationRecentsView recent={recent}/>}
/>
}
我目前在两个地方使用这种模式,一个是组件在setRecent()
发生时安装的地方。另一个是卸载组件的位置。安装组件后,一切正常。当mutate()
被调用时,一切似乎都重新获取并重新渲染。
但是,如果在卸载组件时调用 setRecent(),然后我返回它,我会得到陈旧的数据,并且不会重新获取。
我想我一定是误解了什么mutate(key)
,或者我不清楚它是什么dedupingInterval
。我认为,即使重复数据删除间隔很高,变异也会导致 GetRecentFoundations 缓存无效,因此下一次调用useSWR()
将需要重新验证。