有人问了我一个关于 SWR 的“加载”状态的问题:
如何在不同的 URL 获取之间从 SWR 创建加载状态?
他们的文档 让它看起来很简单:
const { data, error } = useSWR(`/api/user/${id}`, fetcher)
const isLoading = !error && !data;
然而,这个逻辑在钩子/组件的第一次渲染后似乎失败了。在第一次渲染时,数据为undefined
。然后加载数据并成为UI中要消耗的值。假设我通过UI更改了
id
并想显示加载指示器。由于data
不再是undefined
,同样的逻辑失败了。还有一个额外的返回项
isValidating
。所以我更新了我的逻辑:const isLoading = (!data && !error) || isValidating
然而,仅当以下情况之一成立时才可能是正确的:
存在请求或重新验证加载。
因此,从理论上讲,其他事物会导致我的组件重新呈现。这可能会意外地导致“重新验证”,并触发显示加载状态。 这可能会意外破坏UI。
那么,在不重新验证的情况下如何在URL更改之间推断“loading”? 我正在尝试复制GraphQL Apollo Client返回的方式:const { loading, error, data } = useQuery(GET_DOGS);
useSWR
返回的data
属性已经被填充了。他们还指出:“备用数据和先前的数据不被视为“已加载的数据”,因此当您使用备用数据或启用 keepPreviousData 选项时,您可能会有数据可供显示。” - bflemi3