javascript - 反应:使用间隔不清除
问题描述
useInterval
一旦joke
数组有 5 个笑话作为对象,我就会尝试清除该函数。但是,我不确定我做错了什么。完整代码:https ://codesandbox.io/s/asynchronous-test-mp2fq?file=/AutoComplete.js
const [joke, setJoke] = React.useState([]);
function useInterval(callback, delay) {
const savedCallback = useRef();
let id;
useEffect(() => {
savedCallback.current = callback;
if (joke.length === 5) {
console.log("5 STORED AND CLEARED INTERVAL");
return () => clearInterval(id);
}
});
useEffect(() => {
function tick() {
savedCallback.current();
}
id = setInterval(tick, delay);
return () => clearInterval(id);
}, [delay]);
}
useInterval(() => {
// setJoke(joke);
axios.get("https://api.chucknorris.io/jokes/random").then((res) => {
setJoke(joke.concat(res.data.value));
console.log("JOKE: ", joke);
});
console.log("Every 5 seconds");
}, 5000);
解决方案
使用 ref 存储间隔 id,以在重新渲染之间保留它。当长度为 5 时,调用clearInterval
而不是返回将在组件卸载时调用的干净函数。
此外,通过提供一个stop
函数并在组件重新渲染时调用它,使钩子与实际停止条件无关。
function useInterval(callback, delay, stop) {
const savedCallback = useRef();
const interval = useRef();
useEffect(() => {
savedCallback.current = callback;
if (stop?.()) { // call stop to check if you need to clear the interval
clearInterval(interval.current); // call clearInterval
}
});
useEffect(() => {
function tick() {
savedCallback.current();
}
interval.current = setInterval(tick, delay); // set the current interval id to the ref
return () => clearInterval(interval.current);
}, [delay]);
}
const Example () => {
const [joke, setJoke] = React.useState([]);
useInterval(() => {
// setJoke(joke);
axios.get("https://api.chucknorris.io/jokes/random").then((res) => {
setJoke(joke.concat(res.data.value));
console.log("JOKE: ", joke);
});
console.log("Every 5 seconds");
}, 5000, () => joke.length > 4);
return (
...
);
};
推荐阅读
- android - 如何在 Firebase 数据库和 android studio 中以编程方式添加新节点和数据
- visual-studio-code - javascript调试终端使用powershell而不是git bash不断打开
- android - Flutter/Android:如何在 Flutter 中操作音频文件?
- python - 从csv中查找python列表中的索引并组合标签
- python - Numba - 在 jitclass 中使用 jitclass
- woocommerce - Stripe 如何在不询问姓名的情况下确认付款?
- python - +1 是否解决了范围函数不处理列表中最后一项的问题?
- flutter - 我想将动态 Json 转换为 Dart 中的模型。并显示为 listView 可扩展小部件
- flutter - 如何初始化一个块的全局实例
- python - CPP 中的 WSGI 服务器