如何在应用延迟之前将 setInterval 设置为 运行 回调函数一次

How to get setInterval to run callback function once before applying delay

我在 useEffect 挂钩中 运行ning setInterval 来循环一个函数,但是,我希望能够在应用延迟(间隔)之前先 运行 该函数一次。有没有一种方法可以在应用延迟之前在 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);    
  }, []);

我希望在 setInterval 延迟开始之前 forloop 到 运行 一次,但延迟发生在 forloop

之前

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

  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 return 并在 useEffect 的 return 中清除它也是明智的。否则当你的组件要被销毁时,你会得到异常

只用for循环写一个单独的函数。
在调用 useEffect() 之前调用该函数。
从 useEffect() -> 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();

去掉方法中的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);    
  }, []);