javascript - React 以编程方式调用钩子(Hook)

标签 javascript reactjs react-hooks polling

https://codesandbox.io/s/react-hooks-usefetch-cniul

请参阅上面的网址,了解我的代码的非常简化的版本。

我希望能够在一定时间间隔内使用我的钩子(Hook)从 API 重新获取数据(基本上是轮询端点以获取数据)。

我想要的是能够调用像 refetch 这样的东西(正如我在代码中作为注释显示的那样),这本质上只是调用 fetchData再次并用相应的响应更新状态。

解决这个问题的最佳方法是什么?我能想到的唯一方法是在钩子(Hook)中添加一个 checker 变量,该变量是某种 uuid (Math.random() 也许),返回 setCheckerrefetch ,只需将 checker 添加到数组中作为第二个 useEffect 参数来控制重新渲染。因此,每当您调用 refetch 时,它都会调用 setChecker 来更新随机数 (checker),然后函数再次运行。

显然这听起来很“hacky”,一定有更好的方法来做到这一点 - 有什么想法吗?

最佳答案

如果你想进行持续的轮询,我认为你可以将 setInterval() 移动到钩子(Hook)中,如下所示:

function useFetch() {
  const [data, setDataState] = useState(null);
  const [loading, setLoadingState] = useState(true);
  useEffect(() => {
    function fetchData() {
      setLoadingState(true);
      fetch(url)
        .then(j => j.json())
        .then(data => {
          setDataState(data);
          setLoadingState(false);
        });
    }

    const interval = setInterval(() => {
      fetchData();
    }, 5000);

    fetchData();

    return () => clearInterval(interval);
  }, []);

  return [
    {
      data,
      loading
    }
  ];
}

请记住包含return () =>clearInterval(interval);,以便正确清理钩子(Hook)。

关于javascript - React 以编程方式调用钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58584289/

相关文章:

javascript - 仅当某个变量存在时才使用 Effect 依赖,然后仅将其视为依赖

javascript - 管理渲染 Prop 函数中的本地状态

javascript - 位置 :fixed and hash tags (details in body) 的问题

javascript - 如何从嵌套函数中访问变量?

javascript - 普通函数和Marionette.Commands有什么区别

reactjs - 如何将动态值传递给CSS类并在React的Material UI中进行自定义

javascript - 如何在Chrome扩展中同步执行外部js文件

javascript - 在 React Native 中,在 React Navigation v3 中单击 bottomTabNavigator 上的选项卡时,如何刷新我的组件?

javascript - 使用组件键从数组 Reactjs 中删除元素

javascript - react Hook : accessing up-to-date state from within a callback