使用 React 定期运行 fetch

2024-03-13

我有一个包含不同反应组件的网格,所有组件都是独立的 - 因为它们获取自己的数据并显示它。

我想以某种方式让它们每 15 分钟自动重新获取和更新一次。我的第一个想法是 HOC,但是随着更新的钩子和功能组件的出现,我尝试了一些使用钩子的东西。

所以我已经能够创建一个自定义挂钩 - 来处理数据的获取:

const useFetching = (url) => {
  const [loading, setLoading] = useState(true);
  const [data, setData] = useState({});
  const [error, setError] = useState(null);
  const [reload, setReload] = useState(true);

  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch(url);

        if (!response.ok) {
          throw new Error('Something went wrong');
        }

        const json = await response.json();

        if (json) {
          setData(json);
        }
      } catch (error) {
        setError(error);
      }

      setLoading(false);
    }

    fetchData();

  }, [url, reload]);

  return {
    loading,
    data,
    error
  };
};

然后两个组件使用这个:

const App1 = () => {
  const {loading, data, error} = useFetching(
    "https://hn.algolia.com/api/v1/search?query=redux"
  );

  if (loading || error) {
    return <p>{loading ? "Loading..." : error.message}</p>;
  }

  return (
    <ul>
      {data.hits.map(hit =>
        <li key={hit.objectID}>
          <a href={hit.url}>{hit.title}</a>
        </li>
      )}
    </ul>
  );
};


const App2 = () => {
  const {loading, data, error} = useFetching(
    "https://hn.algolia.com/api/v1/search?query=balls"
  );

  if (loading || error) {
    return <p>{loading ? "Loading..." : error.message}</p>;
  }

  return (
    <ul>
      {data.hits.map(hit =>
        <li key={hit.objectID}>
          <a href={hit.url}>{hit.title}</a>
        </li>
      )}
    </ul>
  );
};

ReactDOM.render(<><App1 /><App2/></>, document.getElementById('root'));

这工作得很好 - 使用自定义钩子。所以我在想一些事情:

设置一个间隔计时器,每 15 分钟运行一次并更改“重新加载”状态标志 - 以触发重新获取和更新。还要确保在组件卸载时未设置间隔计时器。

为了访问状态和 setReload 方法 - 我将计时器放置在 useFetching 组件内 - 但这不起作用,因为它启动了多个计时器。我想我有 14 个计时器,只用于两个组件。

我真的不确定如何继续 - 我希望一个计时器只处理所有组件的刷新 - 同时我希望组件是独立的,不必与外部计时器共享任何内容。每个组件有一个计时器就可以了——只要在组件卸载时正确地销毁它——并且如果将此机制内置到 useFetching 挂钩中,那就太好了。

有没有更好的方法来构建这个 - 我没有想到?

非常感谢建议!


你需要一个useInterval钩。这篇文章准确地解释了原因和方式:https://overreacted.io/making-setinterval-declarative-with-react-hooks/ https://overreacted.io/making-setinterval-declarative-with-react-hooks/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 React 定期运行 fetch 的相关文章

随机推荐

  • 是否有任何方法或可能性来隐藏客户端提出的网络请求

    我已经在node js上创建了登录和注册端点 使用react js创建了用于登录和注册以及提交表单的必要表单和字段 将数据发布到服务器并获得正确的响应 在浏览器内的网络部分下 用户可以看到端点和用户提供的数据 用户名和密码 是否有可能向用户
  • 异常:集合被修改;枚举操作可能无法在设置项目中的窗体 Close 上执行

    我创建了一个用 C 4 0 构建的窗口窗体应用程序的安装项目 我在我的测试 PC 上测试了该设置 其中安装了 Vs 2010 Ultimate 并且运行良好 后来为了测试该应用程序 我将其安装在另一台没有 VS 的机器上 每次我尝试关闭表单
  • 从 C 语言的文本文件中读取逗号分隔值[重复]

    这个问题在这里已经有答案了 我对 C 编程非常陌生 这是作业的一部分 我正在尝试读取以下格式的逗号分隔文本文件 value1 value2 在 C 中并尝试将它们作为 string 和 int 参数传递到函数中 我尝试过使用 sscanf
  • Android:在 Flickr 上上传图片

    我必须制作一个 Android 应用程序来将图片从手机上传到 Flickr 我开始读书API Flickr 文档 http www flickr com services api 但仍然想了解如何进行身份验证以及如何上传 我也在这里阅读了类
  • MyBatis - jdbcTypeForNull Oracle

    我将 MyBatis 与 Oracle 11g R2 数据库结合使用 我正在使用 MyBatis 3 3 和 ojdbc6 12 1 0 2 我的问题是每当我尝试插入一个空对象时我都会得到以下信息 org springframework j
  • os.mknod() 在 MacOS 上失败?

    Is os mknod Mac 上的特权调用 总是失败 不允许操作 In 1 import os In 2 os mknod tmp test123 OSError Traceback most recent call last
  • 为什么 vscode 保存 java 文件时遇到问题?我应该检查哪个设置?

    在 vs code 中 我按 Ctr N 然后按 Ctr Shift S 这是 另存为 选项的排序方式 当我尝试将文件另存为 java 时 它会自动保存为类文件 当然 当我尝试不使用排序器保存文件时也会发生这种情况 因此创建 java 文件
  • Kotlin 的可空性和 LiveData

    我想将 LiveData 与 Kotlin 一起使用 并且值不应为空 你如何处理这个问题 也许是 LiveData 的包装 在这里寻找好的模式 举个例子 class NetworkDefinitionProvider MutableLive
  • 自定义 jQuery UI 1.8 中的自动完成显示

    我正在尝试自定义 JQuery 1 8 中自动完成元素的外观 我使用了来自的示例JQuery UI 网站 http jqueryui com autocomplete custom data term autocomplete source
  • 如何保存和使用应用程序的窗口大小?

    使用 NET 4 在关闭时保存应用程序的窗口大小和位置并在下次运行时使用这些值启动应用程序的窗口的最佳方法是什么 我不想接触任何类型的注册表 但不知道是否有某种 app config 类似于 ASP NET 应用程序的 web config
  • 获得使用 FTP-WinSCP 处理我的 Amazon EC2 Ubuntu 服务器上的文件的权限

    我在 Amazon 上有一个 Ubuntu 服务器 我安装了使用它的所有内容 php mysql phpmyadmin apache 问题是我无法使用 FTP 移动或编辑文件 我收到错误消息 Permission denied Error
  • 如何在Backbone.js中使用groupBy对集合进行分组?

    示例集合 仅显示模型 name Bob date Thu Mar 29 2012 name James date Fri Mar 30 2012 name Dylan date Fri Mar 30 2012 name Stanley da
  • D3 鼠标事件——单击和拖动结束

    在 D3 中 如果您定义了这样的拖动函数 var drag d3 behavior drag on drag function alert drag on dragend function alert dragEnd 您确实不能执行以下操作
  • 如何在Android中的地图视图中获取3D建筑视图?

    我使用了地图设置 googleMap setBuildingsEnabled true 但这不起作用 大约一个月前 它运行良好 附上屏幕截图以供参考 这是我一个月前得到的观点 现在地图显示 2D 视图 None
  • 在 Android TV 模拟器上运行时缺少 MainActivity 错误

    我创建了一个示例 Android TV 应用程序用于测试目的 我按照以下文档进行操作 https developer android com training tv start start https developer android c
  • Netbeans + 德比 + 休眠

    我正在跟进http netbeans org kb docs java hibernate java se html http netbeans org kb docs java hibernate java se html学习在 Netb
  • 一次从目录导入所有模块 [NODE]

    MyApp main js modules a js b js c js d js e js 在我的 NodeJS 应用程序中 如何一次性导入 main js 文件中的所有自定义模块 a b c d e 我有一长串模块 我不想单独导入它们
  • JAX-WS 从 jar 加载 WSDL

    我正在编写一个胖客户端 它使用 SOAP 服务来实现某些功能 错误报告等 我的 JAX WS 工作正常 但默认情况下 至少在 netbeans 中 它会在每次初始化服务时从远程服务器获取 WSDL 我希望这有助于提供一些版本控制支持等 但这
  • SQL Select 语句中的动态列,保留“未定义”值

    这是基于我之前的问题的一个新问题 该问题被标记为问题的 重复 mySQL 使用三个表中的数据和列创建新表 https stackoverflow com questions 26665499 mysql create a new table
  • 使用 React 定期运行 fetch

    我有一个包含不同反应组件的网格 所有组件都是独立的 因为它们获取自己的数据并显示它 我想以某种方式让它们每 15 分钟自动重新获取和更新一次 我的第一个想法是 HOC 但是随着更新的钩子和功能组件的出现 我尝试了一些使用钩子的东西 所以我已