React useEffect 和 setInterval

Kon*_*sel 2 setinterval reactjs use-effect

我正在制作一个 React 仪表板,每分钟都会调用 API 进行更新。根据SO中的许多答案,我现在有这样的作品:

const Dashboard = (props) => {
  const [stockData, setStockData] = useState([]);

  useEffect(() => {
    //running the api call on first render/refresh 
    getAPIData();
    //running the api call every one minute
    const interval = setInterval(() => {
     getAPIData()
    }, 60000);
    return () => clearInterval(interval);
  }, []);
  
  //the api data call
  const getAPIData = async () => {
    try {
      const stdata = await DataService.getStockData();
      setStockData(stdata);
    }
    catch (err) {
      console.log(err);
    }
  };
Run Code Online (Sandbox Code Playgroud)

但是我不断收到浏览器警告

React Hook useEffect has a missing dependency: 'getAPIData'. Either include it or remove the dependency array
Run Code Online (Sandbox Code Playgroud)

这是否值得关注(例如导致内存泄漏)?

我尝试修复它:

  • 不使用useEffect似乎不太可能(直接使用setInterval)
  • 如果我删除依赖项或将 stockData 作为 useEffect 的依赖项,我会看到每秒都会进行 API 调用,所以我认为这是不对的。
  • 如果我将api数据调用块直接放在useEffect中,页面第一次加载/或页面刷新时不会显示数据,我必须等待一分钟。

我找到了一些关于这个问题的参考文献,比如 这里这里 ,但我无法理解它,因为我一个月前才开始使用 React。

感谢对此的任何帮助!

Ane*_*iad 5

您可以通过多种方式解决此问题:

  1. 您可以直接将 getApiData 放入 useEffect 并使用它... 在此输入图像描述

  2. 你可以使用useCallBack,useEffect会去重新渲染并产生mempry leeek问题,因为每次react渲染Dashboard都会重新创建getAPIData,你可以通过使用useCallBack来防止这种情况,并且你必须确保依赖关系,只是你需要放置您需要的内容...例如: 在此输入图像描述

  • 请注意,要点很明确,两种解决方案都很好,并且请注意,您想要在组件中声明的任何函数都必须是 useCallBack 来改进它并防止在任何需要使用时出现重新渲染问题一种依赖... (2认同)