【发布时间】:2019-05-27 15:22:12
【问题描述】:
除了在后台保持“时钟”以使用反应钩子在轮播中实现自动下一步(几秒钟后)之外,还有其他选择吗?
下面的自定义反应钩子实现了轮播的状态,支持手动(下一个、上一个、重置)和自动(开始、停止)方法来更改轮播的当前(活动)索引。
const useCarousel = (items = []) => {
const [current, setCurrent] = useState(
items && items.length > 0 ? 0 : undefined
);
const [auto, setAuto] = useState(false);
const next = () => setCurrent((current + 1) % items.length);
const prev = () => setCurrent(current ? current - 1 : items.length - 1);
const reset = () => setCurrent(0);
const start = _ => setAuto(true);
const stop = _ => setAuto(false);
useEffect(() => {
const interval = setInterval(_ => {
if (auto) {
next();
} else {
// do nothing
}
}, 3000);
return _ => clearInterval(interval);
});
return {
current,
next,
prev,
reset,
start,
stop
};
};
【问题讨论】:
-
你的问题到底是什么?如何在没有“时钟”的情况下按时间间隔做某事?
-
另外,因为状态在每个时间间隔都会更新,并且
useEffect有一个清除它的返回函数,它会在每次渲染时启动和停止一个新的时钟。setTimeout在这种情况下应该完全一样 -
有没有其他方法可以让时钟在不被使用的情况下始终在后台运行? — 我尝试在
start方法中使用 useEffect 但没有结果 -
你不能调用
useEffect或在另一个函数体内或在条件后面的任何钩子。它们需要在主渲染体中无条件运行 -
我有..我已经阅读了很多次文档并且还大量使用了钩子。您可以通过将控制台日志放在清理函数的主体中来轻松地自行测试
标签: reactjs carousel setinterval react-hooks