0

我在一个项目中使用 useSWR,我真的很喜欢它,但是在重新验证时遇到了问题。

我有一个 HOC 来封装表单组件,以便在运行验证之前不渲染它们,因为如果表单组件使用缓存的数据进行初始化,它不会在重新验证后重新更新,如下所示:

useEffect(() => {
      if (isValidating) {
        setNumberOfTimesThatHasBeenValidating((n) => n + 1);
      }
    }, [isValidating, setNumberOfTimesThatHasBeenValidating]);

    const requiredNumberOfTimes = 1;
    const hasValidatedRequiredNumberOfTimes =
      (numberOfTimesThatHasBeenValidating >= requiredNumberOfTimes &&
        !isValidating) ||
      numberOfTimesThatHasBeenValidating > requiredNumberOfTimes;
    if (!hasValidatedRequiredNumberOfTimes) {
      return <>{fallback}</>;
    }
    return <RealComponent />

这个想法是,当 isValidating 变为 true 然后变为 false 时,就会发生验证。我之前用一个布尔状态变量“hasValidatedAtLeastOnce”实现了,我认为它工作得很好,但后来我注意到,即使我使用 mutate(),isValidating 在 fetcher 函数运行前一次变为真和假。那应该是什么意思?如果 fetcher 尚未运行,为什么 isValidating 会变为 false?那要验证什么?

这种行为是否足够一致,我可以安全地实现它,只需将所需的次数提高到 2 次?将 mutate 上的“shouldRevalidate”设置为 true 似乎也没有什么不同。

4

0 回答 0