如何在应用延迟之前让setInterval运行一次回调函数

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

我在useEffect钩子中运行setInterval来循环一个函数,但是,我希望能够在应用延迟(interval)之前先运行该函数。有没有办法在应用延迟之前在useEffect钩子中运行一次函数?

我已经尝试在setInterval函数之前在钩子内运行一次该函数,但是它没有给出我希望的结果。在useEffect钩子之外运行该函数也是如此。

  const myText = props.text;
  const textTimeout = 100;
  const funTextInterval = textTimeout * myText.length
  const [quickText, setQuickText] = useState([]);

  const setDelay = (i) => {
    setTimeout(() => {
       myFunction();
     , textTimeout * i);
  };

  useEffect(() => {
    setInterval(() => {
      for (let i = 0; i < myText.length + 1; i++) {
        setDelay(i);
      }
    }, funTextInterval);    
  }, []);

我希望forloop在setInterval启动延迟之前运行一次,但延迟发生在forloop之前

javascript reactjs react-hooks
3个回答
2
投票

取出方法中的for循环逻辑,并在setInterval和setInterval之前调用它

const myText = props.text;
  const textTimeout = 100;
  const funTextInterval = textTimeout * myText.length
  const [quickText, setQuickText] = useState([]);

  const setDelay = (i) => {
    setTimeout(() => {
       myFunction();
     , textTimeout * i);
  };

  useEffect(() => {
    const loop = () => {
      for (let i = 0; i < myText.length + 1; i++) {
        setDelay(i);
      }
    }
    loop();
    setInterval(() => {
      loop();
    }, funTextInterval);    
  }, []);

1
投票

你可以像这样分开你的逻辑:

  const myText = props.text;
  const textTimeout = 100;
  const funTextInterval = textTimeout * myText.length
  const [quickText, setQuickText] = useState([]);

  function applyTextEffect() {
      for (let i = 0; i < myText.length + 1; i++) {
        setTimeout(myFunction, textTimeout * i);
      }
  }

  useEffect(() => {
    applyTextEffect()  // call it here immediately to get the effect you want.
    setInterval(applyTextEffect, funTextInterval);    
  }, []);

但请注意,此组件将通过在每次更新时调用文本效果函数来创建不需要的效果。 UseEffect适用于每次更新。最好有一个isMounted状态变量并在其周围实现逻辑以仅应用效果一次。

编辑:存储从setInterval函数返回的间隔id并清除它以返回useEffect也是明智的。否则,当您的组件将被销毁时,您将获得例外


0
投票

仅使用for循环编写单独的函数。 在调用useEffect()之前调用该函数。 从insideEffect() - > setInterval()里面,调用新方法。

未经测试的代码如下所示。

const myText = props.text;
const textTimeout = 100;
const funTextInterval = textTimeout * myText.length
const [quickText, setQuickText] = useState([]);

const setDelay = (i) => {
  setTimeout(() => {
     myFunction();
   , textTimeout * i);
};

runloop(){
  for (let i = 0; i < myText.length + 1; i++) {
    setDelay(i);
  }
}

useEffect(() => {
  setInterval(() => {
    runloop()
  }, funTextInterval);    
}, []);

runloop();
© www.soinside.com 2019 - 2024. All rights reserved.