useSWR () и mutate () не работают должным образом, когда компонент размонтирован
У меня проблема с неожиданным поведением в отношении изменения (ключа). В моем коде выборки данных у меня есть эти хуки / функции:
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()
потребует повторной валидации.