使用swr时只能获取一次数据吗?

时间:2020-07-07 09:15:48

标签: javascript reactjs

例如,我使用反应路由器切换到其他页面:

let t: T = serde_json::from_str(r#"{"i":1,"f":321.456}"#).unwrap();
println!("i: {}, f: {}", t.i, t.f);
// prints i: 1, f: 321.456

有了swr,当我不是第一次访问该页面时,就可以立即获取数据。 但是,每次我访问该页面时,它都会调用api来获取数据。

如果我不需要重新验证数据是否陈旧,是否只能获取一次数据?

5 个答案:

答案 0 :(得分:0)

SWR概念基于hooks。这意味着它意味着要与本地状态一起使用,而不是与mobx / redux / etc等全局状态一起使用。当然,您可以通过创建自定义上下文,通过React Context与全局状态一起使用。但是您会更喜欢使用mobx / redux吧?

因此,这是一种缓存策略。如果您更喜欢在内存中缓存,请使用mobx / redux。否则,请存储在localStorage / cookie / etc中。

答案 1 :(得分:0)

只需使用 dedupingInterval ,例如:

   const { data } = useSWR(
        `https://api.thecatapi.com/v1/breeds?api_key=51e7b5a4-3b54-4fdf-a61a-84b653d85f8a`,
        fetcher,
        {
            dedupingInterval: 1000000,
        }
    );

答案 2 :(得分:0)

SWR 0.3.8

您应防止由以下选项控制的自动重新验证:

{
  revalidateOnFocus: false,
  revalidateOnMount:false,
  revalidateOnReconnect: false,
  refreshWhenOffline: false,
  refreshWhenHidden: false,
  refreshInterval: 0,
}

根据documentation refreshWhenOfflinerefreshWhenHiddenrefreshInterval在默认情况下处于禁用状态,因此只需设置以下内容即可:

{
  revalidateOnFocus: false,
  revalidateOnMount:false,
  revalidateOnReconnect: false,
}

这将限制SWR运行获取方法。但是,您仍然需要先运行一次才能获取数据。

您最终可能会遇到这样的情况:

const useStaleSWR = (dataKey) => {
  const revalidationOptions = {
    revalidateOnMount: cache.has(dataKey), //here we refer to the SWR cache
    revalidateOnFocus: false,
    revalidateOnReconnect: false,
  };

  return useSWR(dataKey, fetcher, revalidationOptions);
}

0.2.0 version

开始,SWR缓存已公开

毕竟,我不建议为此目的使用SWR。 SWR用于再次获取数据。如果您有静态数据,则只需提取一次并存储在会话/本地存储中,或者定义自己的缓存即可。

答案 3 :(得分:0)

使用此配置会使请求在一小时内仅调用一次。如果您需要更多时间,只需增加重复数据删除间隔即可。

 const { data, error } = useSWR('/api/get.json', fetcher, {
        dedupingInterval: 3600000,
        revalidateOnFocus: false,
        revalidateOnReconnect: false,
    });

答案 4 :(得分:-1)

您可以将revalidateOnFocus设置为false,以防止SWR在窗口重新显示时重新生效。

https://swr.vercel.app/docs/revalidation