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() потребует повторной валидации.

0 ответов

Другие вопросы по тегам