【发布时间】:2021-07-03 17:29:39
【问题描述】:
我的目标:
我正在尝试构建一个组件,当您给它props.items 和props.fadeEvery 时,它将充当文本旋转器。我最终希望它淡入淡出,但我的window.setInterval 有问题。
可能的问题:
我在useEffect 挂钩中调用setIndex,但这不是一个好习惯吗?我如何让它无限地遍历数组项?
TextFade.tsx
// Imports: Dependencies
import React, { useState, useEffect } from 'react';
// TypeScript Type: Props
interface Props {
items: Array<string>,
fadeEvery: number,
};
// Component: Text Fade
const TextFade: React.FC<Props> = (props): JSX.Element => {
// React Hooks: State
const [ index, setIndex ] = useState<number>(0);
// React Hooks: Lifecycle Methods
useEffect(() => {
const timeoutID: number = window.setInterval(() => {
// End Of Array
if (index > props.items.length) {
// Set Data
setIndex(0);
}
else {
// Set Data
setIndex(index + 1);
}
}, props.fadeEvery * 1000);
// Clear Timeout On Component Unmount
return () => window.clearTimeout(timeoutID);
}, []);
return (
<div id="text-fade-container">
<p id="text-fade-text">{props.items[index]}</p>
</div>
);
};
// Exports
export default TextFade;
【问题讨论】:
-
index在所谓的闭包中。你的使用效果被告知只渲染一次[]..所以你需要使用setIndex的回调版本 -
再提醒一下,如果您使用
setInterval,最好使用clearInterval而不是clearTimeout。 MDN 确实说 ID 是共享的,但为了清楚起见,最好让它们保持同步。
标签: javascript html reactjs typescript setinterval