制作按钮组件可能是最可重用的。您可以处理onClick 事件以设置disabled 状态,然后启动计时器将其设置回false。示例:
const DebouncedButton = ({ as = button, delay, onClick, ...props }) => {
const [isDisabled, setDisabled] = useState(false);
useEffect(() => {
if (!isDisabled) {
// timeout elapsed, nothing to do
return;
}
// isDisabled was changed to true, set back to false after `delay`
const handle = setTimeout(() => {
setDisabled(false);
}, delay);
return () => clearTimeout(handle);
}, [isDisabled, delay]);
const handleClick = (e) => {
if (isDisabled) {
return;
}
setDisabled(true);
return onClick(e);
};
const Component = as;
return <Component {...props} disabled={isDisabled} onClick={handleClick} />;
};
您可以像使用按钮一样使用此组件,不同之处在于您向其传递delay,这是单击后应禁用的时间量(以毫秒为单位)。 as 属性允许您传递用于按钮本身的组件,默认为 <button>。
<DebouncedButton
as={Button}
delay={5000}
id="back-btn"
variant="link"
className="btn btn-link"
onClick={() => console.log('click!')}
alt="homepage"
/>
目前它将按钮的disabled 属性设置为true,但如果您不想要视觉效果,只需从组件中删除disabled={isDisabled}。