Fetch 和 setInterval 反应钩子问题

问题描述 投票:0回答:2

我最近使用 React 的钩子从服务器获取数据,但我遇到了钩子的问题。代码看起来是正确的,但看起来

useEffect
不是第一次调用,而是 3 秒后调用
setInterval
。在它出现之前,我有 3 秒钟的空白表格。我想直接显示数据,3秒后调用。

正确的使用方法是什么?

const [datas, setDatas] = useState([] as any);

useEffect(() => {
  const id = setInterval(() => {
    const fetchData = async () => {
      try {
        const res = await fetch(URL);
        const json = await res.json();
        setDatas(jsonData(json));
      } catch (error) {
        console.log(error);
      }
    };
    fetchData();
  }, TIME)

  return () => clearInterval(id);
}, [])
reactjs typescript react-hooks fetch-api setinterval
2个回答
7
投票

您需要在间隔的

之外
最初调用一次fetchData。定义区间外的
fetchData

useEffect(() => {
  // (1) define within effect callback scope
  const fetchData = async () => {
    try {
      const res = await fetch(URL);
      const json = await res.json();
      setDatas(jsonData(json));
    } catch (error) {
      console.log(error);
    }
  };
    
  const id = setInterval(() => {
    fetchData(); // <-- (3) invoke in interval callback
  }, TIME);

  fetchData(); // <-- (2) invoke on mount

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

-1
投票

使用 React Hooks:

  const [seconds, setSeconds] = useState(0)

  const interval = useRef(null)

  useEffect(() => { if (seconds === 60) stopCounter() }, [seconds])

  const startCounter = () => interval.current = setInterval(() => {
    setSeconds(prevState => prevState + 1)
  }, 1000)

  const stopCounter = () => clearInterval(interval.current)
© www.soinside.com 2019 - 2024. All rights reserved.