6

我在我的应用程序中做一个简单的动画。

let flipInterval = useRef();



const startAnimation = () => {
    flipInterval.current = setInterval(() => {
      setIsFlipping((prevFlipping) => !prevFlipping);
    }, 10000);
  };

因为flipInterval.current我得到“类型'超时'不可分配给类型'未定义'”。所以我检查了如何使用 Timeout 类型,我看到人们正在使用但那不起作用。

 let flipInterval = useRef<typeof window.settimeout>();

useRef<number>()这次我也传递了数字,我得到“类型'超时'不可分配给类型'数字'”

这也不起作用

  let flipInterval = useRef<typeof window.setInterval>();
4

6 回答 6

8
 const intervalRef: { current: NodeJS.Timeout | null } = useRef(null);


const startAnimation = () => {
   const id = setInterval(() => {
       setIsFlipping((prevFlipping) => !prevFlipping);
   }, 10000);
      intervalRef.current = id;
 };

  const clear = () => {
    clearInterval(intervalRef.current as NodeJS.Timeout);
  };
于 2021-07-13T21:39:28.390 回答
2

您需要传递正确的返回值类型setInterval。为此用途ReturnType

const flipInterval = useRef<ReturnType<typeof setInterval>>(null)
于 2021-01-09T02:05:52.047 回答
1

如果您正在去抖动并且需要清除超时null需要处理

由于问题的标题,发布这可能会对其他人有所帮助。

const flipInterval:{current: NodeJS.Timeout | null} = useRef(null)

const startAnimation = () => {
  flipInterval.current && clearTimeout(scrollTimeout.current);
        
  flipInterval.current = setInterval(() => {
    setIsFlipping((prevFlipping) => !prevFlipping)
  }, 10000)
}
于 2021-06-17T12:41:20.320 回答
0

您需要使用NodeJS.Timeout类型:

let flipInterval = useRef<NodeJS.Timeout>()

const startAnimation = () => {
  flipInterval.current = setInterval(() => {
    setIsFlipping((prevFlipping) => !prevFlipping)
  }, 10000)
}
于 2021-05-25T00:07:31.453 回答
0
let flipInterval = useRef<number | null>(null);
const startAnimation = () => {
  flipInterval.current = window.setInterval(() => {
    setIsFlipping((prevFlipping) => !prevFlipping);
  }, 10000);
};

/* way of clear interval */
window.clearInterval(flipInterval.current || 0);

于 2021-01-29T06:47:15.697 回答
0

我如何使用
*最好设置 useRef 的初始值。这就是为什么为空。

  const timeout = useRef<NodeJS.Timeout | null>(null);

  timeout.current = setTimeout(() => someAction()), 500);

  useEffect(() => {
    return () => clearTimeout(timeout.current as NodeJS.Timeout);
  }, []);
于 2021-08-11T08:33:12.133 回答