如何在点击按钮后重置useInterval的延迟时间?
解决点击「下一张」后重置useInterval延迟的问题
要实现点击按钮后重置轮播的延迟计时,核心思路是在手动切换幻灯片时,先清除当前运行的定时器,再重新启动一个新的定时器。以下是基于你的代码修改后的具体实现:
方案一:手动管理定时器ID
import { signal, onMount, onCleanup } from 'solid-js'; const currentSlide = signal(0); const intervalTime = 5000; // 保存定时器ID,用于后续清除 const intervalId = signal<number | null>(null); function startInterval() { // 先清除已有定时器,避免重复创建 if (intervalId.value) { clearInterval(intervalId.value); } intervalId.value = setInterval(() => { nextSlide(); }, intervalTime); } function nextSlide() { // 清除当前定时器 if (intervalId.value) { clearInterval(intervalId.value); } // 幻灯片切换逻辑 if (currentSlide.value === slideLength - 1) { currentSlide.value = 0; } else { currentSlide.value++; } // 重新启动定时器,从5秒开始计时 startInterval(); } // 组件挂载时启动自动轮播 onMount(() => { startInterval(); }); // 组件卸载时清除定时器,防止内存泄漏 onCleanup(() => { if (intervalId.value) { clearInterval(intervalId.value); } });
方案二:封装可重置的useResetInterval钩子
如果需要复用这个逻辑,可以封装一个支持重置的自定义钩子,让代码更简洁:
import { signal, onMount, onCleanup } from 'solid-js'; function useResetInterval(callback: () => void, delay: number) { const intervalId = signal<number | null>(null); const start = () => { if (intervalId.value) clearInterval(intervalId.value); intervalId.value = setInterval(callback, delay); }; // 重置定时器的方法 const reset = () => start(); // 初始化启动定时器 onMount(start); // 卸载时清理 onCleanup(() => { if (intervalId.value) clearInterval(intervalId.value); }); return { reset }; } // 在组件中使用 const currentSlide = signal(0); const intervalTime = 5000; const { reset } = useResetInterval(() => { nextSlide(); }, intervalTime); function nextSlide() { if (currentSlide.value === slideLength - 1) { currentSlide.value = 0; } else { currentSlide.value++; } // 切换后重置定时器 reset(); }
原理说明
- 每次点击「下一张」时,先通过
clearInterval终止当前正在运行的定时器,避免它继续触发自动切换。 - 切换完成后重新调用
setInterval,让计时从5秒重新开始,达到重置延迟的效果。
内容的提问来源于stack exchange,提问作者Ferre_Diego
相关产品推荐
相关产品推荐

