反应 useEffect 和 setInterval

时间:2021-05-10 02:11:17

标签: reactjs setinterval 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);
    }
  };

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

React Hook useEffect has a missing dependency: 'getAPIData'. Either include it or remove the dependency array

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

我试图修复它:

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

我发现了一些关于这个问题的参考资料,例如 herehere 但我无法理解,因为我才开始使用 React 一个月前。

感谢您对此的任何帮助!

1 个答案:

答案 0 :(得分:1)

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

  1. 你可以直接把getApiData放在useEffect中使用... enter image description here

  2. 你可以使用useCallBack,useEffect是去重新渲染并使mempry leeek问题,因为每次react render Dashboard都会重新创建getAPIData,你可以使用useCallBack来防止这种情况,你必须确保关于依赖,你只需要输入你需要的东西......例如: enter image description here