Javascript 使用效果无限运行

Javascript 使用效果无限运行,javascript,reactjs,react-hooks,use-effect,Javascript,Reactjs,React Hooks,Use Effect,我正在使用钩子处理react,我使用useEffect第一次调用API,在setinterval的帮助下每隔几秒钟调用一次API,作为一个显示大量数据的屏幕,我需要为其执行autoscroll,使用第三个useEffect来管理时间,但这会导致每秒进行API调用,这会导致性能问题 如何使autoscroll的useEffects不影响其他两个useEffects const [datos, setDatos]=useState([]); const [autoScroll, setAuto

我正在使用钩子处理react,我使用useEffect第一次调用API,在setinterval的帮助下每隔几秒钟调用一次API,作为一个显示大量数据的屏幕,我需要为其执行autoscroll,使用第三个useEffect来管理时间,但这会导致每秒进行API调用,这会导致性能问题

如何使autoscroll的useEffects不影响其他两个useEffects

 const [datos, setDatos]=useState([]);
  const [autoScroll, setAutoScroll] = useState(true);
  const [top, setTop] = useState(false);
  const [step, setStep] = useState(0);
const goTop = () => {
     
    const windowHeight = "innerHeight" in window ? window.innerHeight : 
    document.documentElement.offsetHeight;
    const body = document.body;
    const html = document.documentElement;
    const docHeight = Math.max(body.scrollHeight, body.offsetHeight, 
    html.clientHeight,  html.scrollHeight, html.offsetHeight);
    const windowBottom = windowHeight + window.pageYOffset;

    if (windowBottom >= docHeight && step >1 ) {
       setTop(true)       
    } 
};

const getData = async() => {
  try {
    return await axios.get(`localhost:xxxx/api/data`)
      .then(function(response) {
        return response;
      }).then(function(response) {
        setDatos(response.data.data);
      })
      .catch(function(error) {

        console.log('error catch', (error))
      });
  } catch (error) {
    console.log('error', error)
  }
}

let haveData = false;
useEffect(() => {
  if (!haveData) {
    getData(999);
    haveData = true;
  }
  const interval = setInterval(() => {
    getData(999);
  }, 1200000)
  return () => clearInterval(interval)
}, [])

useEffect(() => {
  if (autoScroll) {
    const timer = setInterval(() => {
      setStep(step + 1)

      if (top === false) {
        scroll.scrollMore(25);
      } else {

        window.scrollTo({
          top: 0,
          behavior: "smooth"
        });
        setTop(false);
      }
    }, 1000);

    goTop();

    return () => clearInterval(timer);
  }
}, [step, autoScroll]);

当您调用
setStep(步骤+1)
时,您会更改
步骤
,从而触发效果挂钩

尝试将其更改为mutator函数,如下所示:

setStep(步骤=>step+1)

然后从hook deps数组中删除
step

当您调用
setStep(step+1)
时,您会更改
step
,从而触发效果挂钩

尝试将其更改为mutator函数,如下所示:

setStep(步骤=>step+1)

然后从hook-deps数组中删除
步骤。

只想快速指出

useEffect(() => {
 ...
}, [step, autoScroll]);
每次
步骤
自动滚动
更改值时,依赖项都将运行它。尝试将
控制台.log
放入该函数以确认

相反,您的第一个带有空依赖项数组的
useffect
可以工作,因此它在装载期间只运行一次。为什么会有帮助?因为您的
setInterval
无论如何都会运行,所以您不必反复定义它


下面是有关
useffect
的一些用法说明

我只是想快速指出

useEffect(() => {
 ...
}, [step, autoScroll]);
每次
步骤
自动滚动
更改值时,依赖项都将运行它。尝试将
控制台.log
放入该函数以确认

相反,您的第一个带有空依赖项数组的
useffect
可以工作,因此它在装载期间只运行一次。为什么会有帮助?因为您的
setInterval
无论如何都会运行,所以您不必反复定义它


下面是有关
useffect
的一些用法说明

进行步骤更改,但保持每秒调用API我很抱歉,如果不深入了解代码,我无法为您提供更多帮助,因为我无法确定您共享的代码中没有任何内容是由我编写的最完整的代码造成的抱歉,您对代码中建议的更改是正确的它不再每秒调用API,但是现在scrooll不再上升,它只是下降,停止,不上升进行步骤更改,但保持每秒调用API我很抱歉,如果没有对代码的更多了解,我无法为您提供更多帮助,因为我无法告诉您,您共享的代码中没有任何内容是您负责的。我将最完整的代码放在了抱歉,您在代码中建议的更改是正确的,它不再每秒进行API调用,但现在scrooll不再上升,它只是下降、停止和不上升